有n种物品和一个容量为v 的背包。第i种物品最多有Mi (Mi=1,k,INF)(01,完全,多重)件可用,每件耗费的空间是Ci,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。
背包初始化:
恰好装满:dp[0]=0,dp[1~n]= - INF;(负无穷)
不必装满:dp[0~n]=0;
1.01背包
for(int i=1;i<=n;i++)
for(int j=v;j>=c[i];j--)
dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
2.完全背包
for(int i=1;i<=n;i++)
for(int j=c[i];j<=v;j++)
dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
3.
多重背包
二进制分解 O(N*&Mi) (&Mi为M1+M2+……Mn)
void ZeroOnePack(int cost,int wei)//01
{
int i;
for(i