基於貪心演算法的0 1揹包問題

2021-04-13 00:12:15 字數 1017 閱讀 5578

貪心演算法的思想:    

貪心演算法不是某種特定的演算法,而是一類抽象的演算法,或者說只是一種思想,它的具體表現在,對解空間進行搜尋時,不是機械地搜尋,而是對區域性進行擇優選取,貪心演算法的目的不是為了找到全部解,也當然找不出最優解,而只是找出一種可行解,這樣效率就比較高。因此,貪心演算法也叫啟發式搜尋,這種啟發就是所謂的 「貪心策略」。

貪心法是一種改進了的分級處理方法。用貪心法設計演算法的特點是一步一步地進行,根據某個優化測度(可能是目標函式,也可能不是目標函式),每一步上都要保證能獲得區域性最優解。每一步只考慮乙個資料,它的選取應滿足區域性優化條件。若下乙個資料與部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增為止。這種能夠得到某種度量意義下的最優解的分級處理方法稱為貪心法。

揹包問題:

已知有n個物品和乙個可容納m重量的揹包,物品i的效益值為p(i),重量為w(i).假設將物體i的一部分x(i)(1<=i<=n, 0<=xi<=1)裝入揹包中,則有價值pi*xi。採用怎樣的方法才能使所裝入的物品總的效益值最大。如果從實際來看,物品一般是不能夠分割的,這也就是0/1揹包問題。

基於0/1揹包問題尋求最優決策。要想得到最優解,就要在效益增長和揹包容量消耗兩者之間尋找平衡。也就是說,總應該把那些單位效益最高的物體先放入揹包。

程式實現:

本例採用c++語言實現,單位效益值比較採用氣泡排序演算法按效益值降序排列。氣泡排序在資料量比較小的時候,複雜度還是可以承受的;當資料量大的時候,可以選擇歸併、快速排序等演算法。

原始碼如下:

#include

using namespace std;

typedef structdata;

class bagcupidity

};void bagcupidity::sort()

while(count>0)

cout<<"輸入資料完成"<0)

}int _tmain(int argc, _tchar* argv)

結語:該程式在visual studio 2005除錯成功,並能正常執行。

基於貪心演算法的揹包問題

題目 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 實驗 include x 存放物品的...

0 1揹包問題 回溯 貪心演算法 C Demo

回溯演算法的效率不是很高,就起本質而言,屬於窮舉,不同的是提供了乙個窮舉的思路 回溯。回溯演算法也稱試探法,基本思想是 從一條路往前走,能進則進。回溯法採用試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至...

揹包問題(貪心演算法)

揹包問題 程式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...