传送门
这题是多重背包的二进制分解+01背包处理。
给个图:
我就不多说了,自己看吧。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
int n,m;
int v[100001];
int w[100001];
int dp[40001];
int main(){
int k;
scanf("%d %d",&k,&m);
for(int i=1;i<=k;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
int now=1;
while(z-now>=0){
n++;
z-=now;
v[n]=x*now;
w[n]=y*now;
now*=2;
}
if(z){
n++;
v[n]=x*z;
w[n]=y*z;
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d",dp[m]);
return 0;
}