zcmu-1711: 揹包(dfs)
阿新 • • 發佈:2018-11-24
1711: 揹包
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 237 Solved: 123
[Submit][Status][Web Board]Description
你有一個神奇的揹包,他的容積是m(0<m<=80),只有你裝滿他,你才能拿走他,現在給你n(1<=n<=20)個物品Xi(Xi<=m),那麼一共有幾種方式,可以讓你拿走揹包?
Input
第一行 n,m
第二行 n個數字
Output
輸出方案數
Sample Input
3 40 20 20 20
Sample Output
3
套了下dfs的模板~還有點小激動呢
參考部落格連結(寫得很詳細)
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <list> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <iostream> #define go(i,a,b) for(int i=a;i<=b;i++) #define og(i,a,b) for(int i=a;i>=b;i--) #define mem(a) memset(a,0,sizeof(a)) #define cs cout<<"-----"<<endl; using namespace std; const int inf=0x3f3f3f3f; const int maxn = 1e4 + 5; typedef long long ll; int n,m,ans;//n:物品數目,m:揹包容量 int a[25]; void dfs(int ok,int index) { if(ok == 0)//能裝滿,算一種方案 { ans++; return; } if(ok < 0 || index > n)//揹包不能夠裝滿 { return; } else//未裝滿時,繼續裝 { dfs(ok - a[index],index + 1);//計算剩餘揹包容量,下標++ dfs(ok,index+1); } } int main() { while(scanf("%d%d",&n,&m) != EOF) { go(i,1,n) scanf("%d",&a[i]); ans = 0; dfs(m,1);//(揹包容量,開始搜尋的下標) cout<<ans<<endl; } return 0; }