貪心演算法 二 一般揹包問題

2021-07-30 03:11:02 字數 2456 閱讀 8147

有乙個揹包,最多放m kg的物體(物體大小不限);

有n個物體,每個物體的重量為wi,每個物體完全放入揹包後可獲得收益pi。問:如何放置能獲得最大的收益?

注:揹包問題分為兩種,若每個物體不可分割,則稱為0/1揹包問題,這種問題無法用貪心法求的最優解,只能求的近似解。而若每個物體可以切分,則稱為一般揹包問題,可以使用貪心法求的最優解。下面討論的就是一般揹包問題。

一般揹包問題中,結果集可以用乙個n元組表示:

1. x的下標i表示物體的序號;

2. xi表示第i個物體加入揹包的部分(0<=xi<=1)

使用貪心法解決最優化問題的第一步,就是要從題目中抽象出目標函式,這是乙個數學建模的過程。

本題中,目標函式就是當前揹包收益的最大值:

所選的物體放入揹包後,不能超過揹包載重m:

將所有物體按照重量遞增的順序排序,每次選重量最小的放入揹包。

這個最優量度標準顯然無法得到整體最優解,因為重量小的物體並不一定價值高。最優解與價值、重量這兩個維度產生關係,而這個最優量度標準僅考慮了乙個維度,因此這樣選擇並不能導致整體最優解。

這種選法也無法達到整體最優解,理由同上。

首先計算所有物體的價效比(重量和收益的比值),每次優先將價效比高的物體放入揹包。

/**

* 定義乙個物體類

*/class body

/**

* 一般揹包問題的**實現

*@param w:每個物體重量的陣列

*@param p:每個物體收益的陣列

*@param m:揹包載重

*@return 結果集(放入哪幾個物體、每個物體放入多少部分)

*/listcommonpackage( int w, int p, int m )

// 對價效比排序(從高到低排序)

collections.sort(bodys, new comaprator()

});// 將物體按照價效比從高到低依次加入揹包

int rest = m;// 剩餘重量

int i=0;

listresults = new arraylist<>();// 存放結果集

for(; iif ( restbreak;

body curbody = bodys.get(i);

results.add(curbody);

rest -= curbody.w;

}// 計算最後乙個物體能放入的部分

body lastbody = bodys.get(i);

results.add(new body(lastbody.id,rest,(lastbody.p*rest/lastbody.w));

}

要用貪心法解決乙個最優化問題,首先要抽象出目標函式、約束條件,再判斷結果能否用乙個n元組表示。最後選擇最優量度標準。

最優量度標準的選擇有多種方式,並不是所有的最優量度標準都能導致整體最優解。最優量度標準的選擇往往是先根據經驗,然後再通過數學歸納法的方式證明它能導致整體最優解。

若無法選出乙個最優量度標準,則可以使用動態規劃法解決最優化問題。

使用物件預設的排序規則

list

<

string

>

list

=new arraylist<>();

collections.sort(list);

如果沒有在sort函式中指定具體的排序規則,則容器會使用容器中儲存物件內部的compareto函式進行排序。由於string類已經重寫了compareto函式,因此這時就會根據這個compareto進行排序。如果物件沒有重寫compareto函式,則預設使用從object繼承的compareto函式,這就會根據位址的雜湊值進行排序。

在物件中自定義排序規則

list

list = new arraylist<>();

collections.sort(list);

class

person

implements

comparable }

在sort函式中傳入自定義排序規則

貪心演算法 一般揹包問題

定義乙個物體類 class body 一般揹包問題的 實現 param w 每個物體重量的陣列 param p 每個物體收益的陣列 param m 揹包載重 return 結果集 放入哪幾個物體 每個物體放入多少部分 listcommonpackage int w,int p,int m 對價效比排...

揹包問題(貪心演算法)

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