#include<iostream>
#include<vector>
using namespace std;
int n,m;
const int N=2010;
int f[N];
int v[N],w[N],s[N];
struct Thing
{
int v,w;
};
vector<Thing>thing;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>v[i]>>w[i]>>s[i];
for(int i=1;i<=n;i++)
{
for(int k=1;k<=s[i];k*=2)
{
s[i]-=k;
thing.push_back({k*v[i],k*w[i]});
}
if(s[i]>0)thing.push_back({s[i]*v[i],s[i]*w[i]});
}
for(auto p:thing)
for(int k=m;k>=p.v;k--)
f[k]=max(f[k],f[k-p.v]+p.w);
cout<<f[m];
return 0;
}
多重背包二进制分解为0-1背包问题
最新推荐文章于 2022-05-11 20:30:15 发布