01背包
int V;//背包最大容量
int w[max_],v[max_];//v为价值 w为重量
int dp[max_];
for(i=1;i<=n;i++)
{
for(j=V;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
完全背包
①
int V;//背包最大容量
int w[max_],v[max_];//v为价值 w为重量
int dp[max_];
for(i=1;i<=n;i++)
{
for(j=w[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
②
转为01背包 每件物品的最大数量为V/w[i]
多重背包
① 二进制优化
int V;//背包最大容量
int w[max_],v[max_],num[max_];//v为价值 w为重量 num为数量
int dp[max_];
for(i=1;i<=n;i++)
{
if(num[i]*w[i]>=V)//转为完全背包
{
for(j=w[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
else
{
int k=1;
while(k<=num[i])
{
for(j=V;j>=k*w[i];j--)//把k个物品加起来看作是一个物品
dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
num[i]-=k;
k*=2;
}
for(j=V;j>=num[i]*w[i];j--)//处理剩余的物品
dp[j]=max(dp[j],dp[j-num[i]*w[i]]+num[i]*v[i]);
}
}
②
转化为01背包 每种物品有num[i]个