#include <bits/stdc++.h>
using namespace std;
const int MAXN=11050; //个数是1000*log2(2000);1000×以log以2为底2000的数
const int MAXV=2005;
int temp_v[MAXN]; //存储实际每个的体积
int temp_w[MAXN]; //存储实际每个的价值
int v[MAXN]; //要拓展的体积
int w[MAXN]; //要拓展的个数
int s[MAXN]; //存储件数
int dp[MAXV];
int vi;
int n;
void knapsack()
{
for(int i=1;i<=n;i++){
for(int j=vi;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]); //01背包的滚动数组
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>vi;
for(int i=1;i<=n;i++)
{
cin>>temp_v[i]>>temp_w[i]>>s[i];
}
int k=0; //要拓展的下标
for(int i=1;i<=n;i++){
for(int j=1;j<=s[i];j<<=1){
k++; //下标加1
v[k]=j*temp_v[i];
w[k]=j*temp_w[i];
s[i]-=j;
}
if(s[i]!=0){
k++; //下标加1
v[k]=s[i]*temp_v[i];
w[k]=s[i]*temp_w[i];
}
}
n=k;
knapsack();
cout<<dp[vi]<<'\n';
return 0;
}
AcWing-5:多重背包问题 II
最新推荐文章于 2024-10-08 18:38:07 发布