多重背包
/**\ n种物品,第i种物品重量wi,价值vi,物品ci个,背包容量为m 例如某物品a,价值v,重量w,数量c个。 假设c=13,有13这样子的物品,我们使用二进制拆分,将13拆分为几个整数的和 拆成1、2、4、6,这样子1~13中任何的数都能由任意两个数组成。 for (int i = 1; i <= c; i *= 2) { c -= i;//加入i } if (c > 0) { //加入c } \**/ #include<iostream> using namespace std; const int mx = 1e6 + 5; int dp[mx], v[mx], w[mx], n, m, a, b, c, cot; int main() { cin >> n >> m; for (int i = 0; i < n; i++){ cin >> a >> b >> c; for (int j = 1; j <= c; j <<= 1){ v[++cot] = a * j; w[cot] = b * j; c -= j; } if (c) { v[++cot] = a * c; w[cot] = b * c; } } for (int i = 1; i <= cot; i++) for (int j = m; j >= w[i]; j--) dp[j] = max(dp[j], dp[j - w[i]] + v[i]); printf("%d\n", dp[m]); return 0; }