AcWing 5. 多重背包问题 II
原题链接
中等
作者:
hai阿卢
,
2021-02-14 12:11:55
,
所有人可见
,
阅读 212
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=30000;
int f[M],w[M],v[M];
int main()
{
int n,m,j=1;
cin>>n>>m;
//二进制优化
for(int i=1;i<=n;i++)
{
int v1,w1,s1;
cin>>v1>>w1>>s1;
int k=1;
while(s1-k>0)
{
s1-=k;
w[j]=k*w1;
v[j]=k*v1;
k=k*2;
j++;
}
if(s1>0)
{
w[j]=s1*w1;
v[j]=s1*v1;
j++;
}
}
//01背包问题
n=j-1;
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];
return 0;
}