12G:忍者道具
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?
- 输入
- 第一行包含两个用空格隔开的整数,N和W。
接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。 - 输出
- 输出一个整数,最少需要多少个工具包。
- 样例输入
-
5 1996 1 2 1994 12 29
- 样例输出
-
2
- 提示
- 对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。
1 #include<iostream> 2 using namespace std; 3 int a[20]; 4 int bag[20]; 5 int ans = 1<<30; 6 int n, w; 7 void dfs(int x, int sum){ //正在放第x个物品,已经用了sum个背包 8 if(sum>=ans) return; 9 if(x==n+1){ 10 ans = min(ans,sum); 11 return; 12 } 13 for(int i = 1; i <= sum; i++){ //放在已有背包里 14 if(bag[i]>=a[x]){ 15 bag[i] -= a[x]; 16 dfs(x+1, sum); 17 bag[i] += a[x]; 18 } 19 } 20 bag[sum+1]-=a[x]; //或者新开一个背包 21 dfs(x+1, sum+1); 22 bag[sum+1]+=a[x]; 23 } 24 int main(){ 25 cin>>n>>w; 26 for(int i = 1; i <= n; i++) 27 cin>>a[i]; 28 for(int i = 1; i <= n; i++) 29 bag[i] = w; 30 dfs(1, 1); 31 cout<<ans<<endl; 32 return 0; 33 }
备注:我觉得我得好好看看dfs,不能再一看见这种搜索题就懵orz 这题数据规模这么小,完全一看就是搜索。
搜的话就看看搜什么。每个物品都要装包里的,那就搜物品好了。每个物品无非就两种可能,要么就装在已有的包里,要么新开一个包,我没想到可以用一个数组来模拟背包,也没想到可以在dfs加一个参数表示现在已经用了多少背包。
自闭了。