混合背包
混合背包的意思是说,物品中有些物品只有一件,有些有无数件,有些则为有限件。那么这种背包的解法,便是化成两类——01和完全。
struct love//定义背包物品结构体
{
int kind,v,w;//类型,体积,价值
};
int dp[MAXN];
int n,m;//物品种数,背包容积
int main()
{
vector<love> wife;
for(int i=0;i<n;i++)
{
int a,b,c;//物品数量(0为无穷),体积,价值
cin>>a>>b>>c;
if(a==0||a==1) wife.push_back({a,b,c});//01和完全直接存入
else
{
for(int j=1;j<=a;j*=2)
{
a-=j;
wife.push_back({1,j*b,j*c});//多重化01
}
if(a) wife.push_back({1,a*b,a*c});
}
}
for(auto it: wife)
{
if(it.kind)
for(int j=m;j>=it.v;j--)//01背包从大往小
dp[j]=max(dp[j],dp[j-it.v]+it.w]);
else
for(int j=it.v;j<=m;j++)//完全背包从小往大
dp[j]=max(dp[j],dp[j-it.v]+it.w);
}
cout<<dp[m]<<endl;
}
还是比较简单的