背包问题
01背包问题:拿与不拿的问题
核心公式:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:
“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一
个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值
为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得
的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
一共有4个物品,总容量6
weight容量 value价值
第1个物品 1 4
第2个物品 2 6
第3个物品 3 12
第4个物品 2 7
for(i=1;i<=n;i++)
for(v=m;v>=weight[i];v--)
f[v]=max(f[v],f[v-weight[i]]+value[i]);
依次考虑将这4个物品放入背包
第1个物品 f[6]=4 f[5]=4 f[4]=4 f[3]=4 f[2]=4 f[1]=4
第2个物品 f[6]=10 f[5]=10 f[4]=10 f[3]=10 f[2]=6
第3个物品 f[6]=22 f[5]=18 f[4]=16 f[3]=12
第4个物品 f[6]=23 f[5]=19 f[4]=16 f[3]=12 f[2]=7
完全背包问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。
核心公式:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}
一共有4个物品,总容量6
weight容量 value价值
第1个物品 1 2
第2个物品 2 6
第3个物品 3 12
第4个物品 2 7
for(i=1;i<=n;i++)
for(v=weight[i];v<=m;v++)
f[v]=max(f[v],f[v-weight[i]]+value[i]);
依次考虑将这4个物品放入背包
第1个物品 f[1]=2 f[2]=4 f[3]=6 f[4]=8 f[5]=10 f[6]=12
第2个物品 f[1]=2 f[2]=6 f[3]=8 f[4]=12 f[5]=14 f[6]=18
第3个物品 f[1]=2 f[2]=6 f[3]=12 f[4]=14 f[5]=18 f[6]=24
第4个物品 f[1]=2 f[2]=7 f[3]=12 f[4]=14 f[5]=18 f[6]=24
多重背包:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用。
核心公式:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}
文章列题来自队友。
更多背包问题请看背包九讲:http://wenku.baidu.com/link?url=EKnPUq4mi40Iq3Y6fAPQa5K2_W35rX4o1JQAp3-UE-HvaGa_BEBAgtx0lgbaco5bcSM2u6yKOiPH8CWJWDE22p20edetFMn3SWapKOMBKlq