首页 > 代码库 > 背包问题

背包问题

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

背包问题