题目:
题解:
在每次输入按照对应的背包处理方案进行处理即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[1010];
vector<pair<int,int> > q;
int main(){
int N,V;
scanf("%d%d",&N,&V);
for(int i=0;i<N;i++){
int v,w,s;
scanf("%d%d%d",&v,&w,&s);
if(s<0){
for(int j=V;j>=v;j--)dp[j]=max(dp[j],dp[j-v]+w);
}
else if(s==0){
for(int j=v;j<=V;j++)dp[j]=max(dp[j],dp[j-v]+w);
}else {
q.clear();
for(int k=1;k<=s;k*=2){
q.push_back({v*k,w*k});
s-=k;
}
if(s>0)q.push_back({v*s,w*s});
for(auto x:q){
for(int j=V;j>=x.first;j--){
dp[j]=max(dp[j],dp[j-x.first]+x.second);
}
}
}
}
printf("%d",dp[V]);
return 0;
}