我去年买了一个包。。。
之前学动态规划时就纠结动态规划问题,寒假回去一直看黑书《算法导论》,看得似懂非懂。。。
今天要学背包问题,趁早看了下,稍有点理解。。。
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]);
完全背包:
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]);