AcWing 7. 混合背包问题
原题链接
中等
作者:
rushhhhh
,
2021-02-17 17:58:45
,
所有人可见
,
阅读 271
#include <iostream>
#include <vector>
using namespace std;
/*
把多重背包问题转化为01背包问题
这样,所有物品就被分为只能用1次和能用无限次
针对vector中物品的不同类别,用对应的状态转移方程计算即可
*/
const int N = 1010;
int n, m;
int v, w, s;
int f[N];
struct Thing
{
int cate;
int v, w;
};
std::vector<Thing> things;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
cin >> v >> w >> s;
if(s < 0)
things.push_back({-1, v, w});
else if(s == 0)
things.push_back({0, v, w});
else
{
int k = 1;
while(k <= s)
{
things.push_back({-1, v*k, w*k});
s -= k;
k *= 2;
}
if(s)
things.push_back({-1, v*s, w*s});
}
}
for(auto thing : things)
{
if(thing.cate < 0)
for (int j=m; j>=thing.v; j--)
f[j] = max(f[j], f[j-thing.v]+thing.w);
else
for (int j=thing.v; j<=m; j++)
f[j] = max(f[j], f[j-thing.v]+thing.w);
}
cout << f[m];
return 0;
}