混合背包
作者:
殇ベ_11
,
2021-02-03 15:22:46
,
所有人可见
,
阅读 318
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 1000 000;
int n,m,dp[N<<1],val[N<<1],we[N<<1];
int main()
{
cin>>n>>m;
int cnt=1;
for(int i=1;i<=n;i++)
{
int k=1;
int a,b,s;
cin>>a>>b>>s;
if(s<0) s=1;
else if(s==0) s=m/a;
while(k<=s)
{
val[cnt]=k*b;
we[cnt]=k*a;
s-=k;
k<<=1;
cnt++;
}
if(s>0)
{
val[cnt]=s*b;
we[cnt]=s*a;
cnt++;
}
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=we[i];j--)
{
dp[j]=max(dp[j],dp[j-we[i]]+val[i]);
}
}
}
cout<<dp[m];
}