还是01背包
时间限制:
10000 ms | 内存限制:
228000 KB
难度:
5
-
描述
-
有n个重量和价值分别为 wi 和 vi 的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
-
输入
-
多组测试数据。
每组测试数据第一行输入n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
1 <= n <=40
1 <= wi <= 10^15
1 <= vi <= 10^15
1 <= W <= 10^15
输出
- 每组数据输出一行,代表挑选方案中价值总和的最大值。 样例输入
-
4 5 2 3 1 2 3 4 2 2
样例输出
-
7
-
用前缀数组的方式剪枝,妙啊妙
-
#include<bits/stdc++.h> using namespace std; #define ll long long const int MAX = 50; ll pv[MAX], pw[MAX], v[MAX], w[MAX]; ll n, m, ans; void dfs(ll i, ll val, ll W) { if(i == 1) { ans = max(ans, val); return; } if(W == 0 || val + pv[i] < ans) return; if(W >= pw[i]) { val += pv[i]; ans = max(val, ans); return; } if(W >= w[i]) dfs(i - 1, val + v[i], W - w[i]); dfs(i - 1, val, W); } int main() { while(cin >> n >> m) { memset(pv, 0, sizeof pv); memset(pw, 0, sizeof pw); for(int i = 1; i <= n; i++) { cin >> w[i] >> v[i]; pv[i] = pv[i - 1] + v[i]; pw[i] = pw[i - 1] + w[i]; } ans = 0; dfs(n, 0, m); cout << ans << endl; } return 0; }
-
多组测试数据。