原题链接
多重背包问题就是给定每个物品的数量,那么多重背包的优化是利用二进制的倍增转换成了01背包问题。
其实关键的就是预处理的这段代码,就是分成了好多堆,然后就是选不选这个堆,这就是个01背包问题了。
朴素版的多重背包就是从0开始遍历物品的数量,这里我们是选择1、2、4的数量分成堆,然后把堆赋予属性–体积和价值,物品1分成若干堆了,然后就将下一个物品再分成若干堆…。
s -= k 还有就是 if(s > 0) 这个如果成立代表的就是最后一堆不是前一堆的二倍了。#include using namespace std;const int N = 12010, M = 2010;int n, m;
int v[N], w[N];
int f[M];int main()
{cin >> n >> m;int cnt = 0;for (int i = 0; i < n; i ++ ){int a, b, s;cin >> a >> b >> s;int k = 1;while(k <= s){cnt ++;v[cnt] = a * k;w[cnt] = b * k;s -= k;k *= 2;}if (s > 0){cnt ++;v[cnt] = a * s;w[cnt] = b * s;}}n = cnt;for (int i = 1; i <= n; i ++ ){for (int j = m; j >= v[i]; j -- ){f[j] = max(f[j], f[j - v[i]] + w[i]);}}cout << f[m] << endl;}