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加一个参数表示现在已经用了多少背包。

自闭了。

posted @ 2020-06-18 23:03  timeaftertime  阅读(553)  评论(0编辑  收藏  举报