貪心演算法 揹包問題

2021-07-13 06:42:21 字數 1808 閱讀 5555

部分**:

揹包問題

(1)0-1揹包問題:給定n種物品和乙個揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

注:在選擇裝入揹包的物品時,對每種物品i只有2種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入揹包多次,也不能只裝入部分的物品i。

0-1揹包問題可用動態規劃演算法來求解,具體過程可參看筆者博文《動態規劃 金礦模型 01揹包問題

》。(2)揹包問題:與0-1揹包問題類似,所不同的是在選擇物品i裝入揹包時,

可以選擇物品i的一部分

,而不一定要全部裝入揹包,1≤i≤n。這2

類問題都具有

最優子結構

性質,極為相似,但揹包問題可以用貪心演算法求解,而

0-1揹包問題卻不能用貪心演算法求解。用貪心演算法解揹包問題的基本步驟是,首先計算每種

物品單位重量的價值vi/wi

,然後,依貪心選擇策略,將盡可能多的單位重量價值最高的物品裝入揹包。若將這種物品全部裝入揹包後,揹包內的物品總重量未超過c,則選擇單位重量價值次高的物品並盡可能多地裝入揹包。依此策略一直地進行下去,直到揹包裝滿為止。

具體**如下:

[cpp] view plain copy

//4d2 貪心演算法 揹包問題

#include "stdafx.h"

#include using namespace std;

const int n = 3;

void knapsack(int n,float m,float v,float w,float x);

int main()

;//下標從1開始

float v = ;

float x[n+1];

cout<

x[i]=1;

c-=w[i];

} //物品i只有部分被裝下

if (i<=n)

}

程式執行結果為:

演算法knapsack的主要計算時間在於將各種物品依其單位重量的價值從大到小排序。因此,演算法的計算時間上界為o(nlogn)。為了證明演算法的正確性,還必須證明揹包問題具有貪心選擇性質。這種貪心選擇策略對0-1 揹包問題就不適用了。看下圖例子,其中有3中物品,揹包的容量為50千克。物品1重10千克;價值60元;物品2重20千克;價值100元;物品3重30千克,價值120元。因此,物品1每千克價值6元,物品2每千克價值5元,物品3每千克價值4元。若依貪心選擇策略,應首先選擇物品1裝入揹包,然而從圖b中各種情況可以看出,最優的選擇方案是選擇物品2和物品3裝入揹包。首選物品1的兩種方案都不是最優的。對於揹包問題,貪心選擇最終可得到最優解,其選擇方案如圖c所示。

對於0-1揹包問題,貪心選擇之所以不能得到最優解是因為在這種情況下,

它無法保證最終能將揹包裝滿,部分閒置的揹包空間使每公斤揹包空間的價值降低了

。事實上,在考慮0-1揹包問題時,應比較選擇該物品和不選擇該物品所導致的最終方案,然後再作出最好選擇。由此就匯出許多互相重疊的子問題。這正是該問題可用動態規劃演算法求解的另一重要特徵。

揹包問題(貪心演算法)

揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...

貪心演算法 揹包問題

詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...

貪心演算法 揹包問題

貪心演算法 當前最優解 例如在刪除數的乙個例子中,乙個長度不大於240位的整數中,隨機刪除n個數,要求使得剩餘的數 從左到右的,組成乙個最小的整數 貪心步驟 例如 乙個數 1457326 n 4 1 找到當前最大的數 7 刪除 145326 2 找到當前最大的數 6 刪除 14532 3 找到當前最...