01背包:
有N件物品和一个容量为V的背包。第i件物品的费用(体积)是C[i],价值是W[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量V,且价值总和最大。
它有个特点是:每种物品仅有一件,可以选择放或不放。
f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值;
- for(i=1; i<=N; i++)
- {
- for(j=0; j<=V; j++)
- {
- if(j>=c[i])
- {
- f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);
- }
- else f[i][j]=f[i-1][j];
- }
- }
空间优化代码
- for(i=1;i<=N;i++)
- for(j=V;j>=c[i];j--)
- f[j]=max(f[j],f[j-c[i]]+w[i]);
完全背包:
完全背包是每件物品有无数件,不再是取不取的问题,而是取0,1,2,3~~的问题
- for(i=1;i<=N;i++)
- for(j=0;j<=V;j++)
- for(k=1;k<=j/c[i];k++)
- dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*c[i]]+k*w[i]);
空间优化代码
- for(i=1; i<=N; i++)
- for(j=c[i]; j<=V; j++)
- f[j]=max(f[j],f[j-c[i]]+w[i]);