题意:多重背包
裸题,直接模板。
#include<bits/stdc++.h>
using namespace std;
int dp[50005];
int cc[105],vv[105],mm[105];
int n,W;
void b0(int c,int v){
for(int i = W;i>=c;i--){
dp[i] = max(dp[i],dp[i-c]+v);
}
}
void ba(int c,int v){
for(int i = c;i<=W;i++){
dp[i] = max(dp[i],dp[i-c]+v);
}
}
void mb(int c,int v,int m){
if(c*m>=W)
{
ba(c,v);
return ;
}
int k = 1;
while(k<m){
b0(k*c,k*v);
m = m-k;
k = k<<1;
}
if(m>0)
b0(m*c,m*v);
}
int main()
{
while(~scanf("%d%d",&n,&W)){
memset(dp,0,sizeof(dp));
for(int i = 1;i<=n;i++){
scanf("%d%d%d",&cc[i],&vv[i],&mm[i]);
}
for(int i = 1;i<=n;i++){
mb(cc[i],vv[i],mm[i]);
}
cout<<dp[W]<<endl;}
}