揹包問題

01揹包問題:拿與不拿的問題url

核心公式:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}spa

這個方程很是重要,基本上全部跟揹包相關的問題的方程都是由它衍生出來的。因此有必要將它詳細解釋一下:io

「將前i件物品放入容量爲v的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就能夠轉化爲一co

個只牽扯前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

相關文章
相關標籤/搜索