测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A48213. 忍者道具忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?输入第一行包含两个用空格隔开的整数,N和W。接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。输出输出一个整数,最少需要多少个工具包。样例输入5 19961219941229样例…

填空题 困难

题目描述

忍者道具

忍者道具有很多种,苦无,飞镖,震爆弹。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。

参考答案

#include <iostream> using namespace std; const int MAXN = 18; int used[MAXN]; int W; int m, n, ans = (1 << 30); int item[MAXN]; int bag[MAXN]; void dfs(int x, int sum) { if (sum >= ans) return; if (x == n) { ans = min(ans, sum); return; } for (int i = 0; i < sum; ++i) { if (bag[i] >= item[x]) { bag[i] -= item[x]; dfs(x + 1, sum); bag[i] += item[x]; } } bag[sum] -= item[x]; dfs(x + 1, sum + 1); bag[sum] += item[x]; } int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> item[i]; bag[i] = m; } dfs (0, 1); cout << ans << endl; return 0; }

答案解析

具体思路是以物品作为层数,枚举每个物品放在哪个背包里。

上一题 下一题