有 N 种物品和一个容量是 V 的背包。
第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行三个整数 vi,wi,si用空格隔开,分别表示第 i 种物品的体积、价值和数量。
输出一个整数,表示最大价值。
0<N≤10000
0<V≤20000
0<vi,wi,si≤20000
本题考查多重背包的二进制优化方法。
4 5
1 2 3
2 4 1
3 4 3
4 5 2
10
假如有14件体积为v,价值为w的某物品,我们可以将它们分组打包成4组, 每组分别有1,2,4,6件,将这每组物品看成不可分割的一个物品,这四组的选与不选的组合可以表示选0 ~ 14个任意一种情况
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2010;
int dp[N];
int main() {
int n, t;
cin >> n >> t;
while(n--) {
int v, w, s;
cin >> v >> w >> s;
int cnt = 1;
while(cnt < s) {
for(int i = t; i >= cnt * v; i--) {
dp[i] = max(dp[i], dp[i - cnt * v] + cnt * w);
}
s -= cnt;
cnt *= 2;
}
if(s) {
for(int i = t; i >= s * v; i--) {
dp[i] = max(dp[i], dp[i - s * v] + s * w);
}
}
}
cout << dp[t];
return 0;
}
原文:https://www.cnblogs.com/bleso/p/14778467.html