#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int main()
{
int n,V;
cin>>n>>V;
int v,w,p;//v是每一组数据的体积 w是每一组数据的价值 p是物品的使用次数
//如果p=-1,则是01背包;如果p=0,则是完全背包,如果p大于0,则是多重背包,大于0的时候p代表该物品的使用次数
for (int i = 0; i <n; i++)
{
cin>>v>>w>>p;
if(p==-1) //01背包 物品只能用一次
{
for(int j=V;j>=v;j--)
{
dp[j]=max(dp[j],dp[j-v]+w);
}
}
else if(p==0) //完全背包 物品可以用无数次
{
for(int j=v;j<=V;j++)
{
dp[j]=max(dp[j],dp[j-v]+w);
}
}
else //多重背包 物品有使用次数的限制
{
int num=min(p,V/v);//优化
for(int k=1;num>0;k<<=1)
{
if(k>num) k=num;
num-=k;
for(int j=V;j>=v*k;j--)
{
dp[j]=max(dp[j],dp[j-v*k]+w*k);
}
}
}
}
cout<<dp[V]<<endl;
return 0;
}
混合背包模板
于 2022-04-29 20:37:45 首次发布