混合背包
作者:
橙外
,
2021-02-03 15:20:06
,
所有人可见
,
阅读 294
把01背包,完全背包,多重背包全部组合起来
#include <iostream>
#include <algorithm>
using namespace std;
#define N 20000
int f[N],w[N],v[N],n,m,cnt;
bool vis[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
int a,b,c;
cin >>a >>b >>c;
if (c == -1) // 01背包
{
v[++cnt] = a;
w[cnt] = b;
vis[cnt] = true;
}
if(!c) // 完全背包
{
v[++cnt] = a;
w[cnt] = b;
vis[cnt] = false;
}
if (c > 0) // 多重背包(转化成01背包)
{
int k = 1;
while (k <= c)
{
v[++cnt] = k * a;
w[cnt] = k * b;
vis[cnt] = true;
c -= k;
k <<= 1;
}
if (c > 0)
{
v[++cnt] = c * a;
w[cnt] = c * b;
vis[cnt] = true;
}
}
}
for (int i = 1;i <= cnt; i++)
{
if (vis[i]) // 01背包
{
for (int j = m; j >= v[i]; j--)
f[j] = max(f[j] , f[j - v[i]] + w[i]);
}
else // 完全背包
{
for (int j = v[i]; j <= m; j++)
f[j] = max(f[j] , f[j - v[i]] + w[i]);
}
}
cout << f[m];
return 0;
}
%%%
tql
wow!!!
nice 太牛逼!