0 1揹包和完全揹包

2021-07-24 22:23:36 字數 2779 閱讀 1894

一.0-1揹包

1.0-1揹包指的是每件物品要麼取一次,要麼不取,目的是找到裝到揹包裡最大價值。c[n]代表物體重量,w[n]代表物體價值,v代表揹包容量。

2.時間複雜度:o(n*v)   n指的是物品個數,v指的是揹包的容量,這是最優情況,無法再優。

3.空間複雜度:原始:f[n+1][v+1]———>改進:f[v+1];

4.初始化問題:

(1)如果沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將f[0..v]全部設為 0。

(2)如果要求恰好裝滿揹包,那麼在初始化時除了f[0]為 0,其它f[1..v]均設為-∞,這樣就可以保證最終得到的 f[n]是一種恰好裝滿揹包的最優解。

5.0-1揹包改進演算法第二重迴圈為何逆序的分析

for(i=0;i

for(v=v;v>=c[i];v--)   //這裡為何要逆序?

f[v]=max(f[v],f[v-c[i]]+w[i]);              

分析:由原始的狀態轉移方程可知當v>=c[i]時,

f[i][v]=max

。   ‚

要保證第i次迴圈中的狀態 f[i][v]是由狀態f[i-1][v-c[i]]遞推而來,即如何保證中

f[v-c[i]]

是中的f[i-1][v-c[i]]。

為直**出畫圖如下:

從圖中可以看出,當第二重迴圈正序時,當掃到點3的時候,

f[v-c[i]]

的值並不是

f[i-1][v-c[i]]

,而是f[i][v-c[i]]。只有逆序的時候才可以做到要求的那樣。

二.完全揹包(只給出一種o(n*v)演算法)

1.完全揹包:各物品可以無限取。

2.時間複雜度:o(n*v)

3.空間複雜度:f[v+1];

三.

0-1揹包和完全揹包的對比情況:

因為0-1揹包每件物品只能取一次,而完全揹包不限取的次數。

0-1揹包:f[i][v]=max

要麼取第i種物品,問題轉化為前

i-1種物品放入剩下的容量為

v-c[i]

的揹包中。

要麼不取第i種物品,問題轉化為前

i-1種物品放入容量為

v的揹包中。

完全揹包:          f[i][v]=max

要麼取第i種物品,問題轉化為前

i種物品放入剩餘的容量為

v-c[i]

的揹包中。

要麼不取第i種物品,問題轉化為前

i-1種物品放入容量為

v的揹包中。

對於完全揹包用一維陣列:

for(i=0;i

for(v=c[i];v<=v;v++)

f[v]=max(f[v],f[v-c[i]]+w[i]);

這裡的第二重迴圈必須得正序,因為只有正序才能保證max裡面的

f[v-c[i]]

是f[i][v-c[i]]

四.示例

w[4]=//各物品價值

c[4]=//各物品重量

設揹包容量為v

五.**清單

#include #include #define min -32768

int max(int a,int b)

//0-1揹包

int knapsack_01_bas(int w,int c,int n,int v)

}if(f[n][v]<0)

f[n][v]=0;

return f[n][v];

}int knapsack_01_bas_fill(int w,int c,int n,int v)

}if(f[n][v]<0)

f[n][v]=0;

return f[n][v];

}int knapsack_01_pro(int w,int c,int n,int v)

*/for(i=0;i<=v;i++)

for(i=0;i=c[i];v--)

f[v]=max(f[v],f[v-c[i]]+w[i]);

if(f[v]<0)

f[v]=0;

return f[v];

}int knapsack_01_pro_fill(int w,int c,int n,int v)

/*for(i=0;i<=v;i++)

*/for(i=0;i=c[i];v--)

f[v]=max(f[v],f[v-c[i]]+w[i]);

if(f[v]<0)

f[v]=0;

return f[v];

}//完全揹包

int knapsack_complete(int w,int c,int n,int v)

for(i=0;i

01揹包和完全揹包

在hihocoder上面的題目中看到的這個問題,總結一下。先看01揹包問題。01揹包問題 乙個揹包總容量為v,現在有n個物品,第i個 物品體積為weight i 價值為value i 現在往揹包裡面裝東西,怎麼裝能使揹包的內物品價值最大?看到這個問題,可能會想到貪心演算法,但是貪心其實是不對的。例如...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...

01揹包 完全揹包

本文主要使用一維陣列進行使用 意思 01揹包 代表物品只有兩種狀態,只能使用一次。如,dp i max dp i dp i wight j value j 代表容量為i所獲得的最大利潤。完全揹包 乙個物品可以使用無限次 技巧 1.如果是0 1揹包,即陣列中的元素不可重複使用,nums放在外迴圈,ta...