一.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...