a,貪心演算法:該演算法應用於優化問題,即問題涉及通過一組配置來找出定義在這些配置上的目標函式的最小值或者最大值。為了求解給定的優化問題需要進行一系列的選擇,這個序列開始於某些易於理解的起始配置,然後從當前可能的配置中,反覆做出看起來是最好的決策。這個特點說明,從乙個良好的定義的配置開始,通過一系列區域性最優選擇,可以得到全域性最優配置。當然貪心演算法不會總是導致問題的最優解,但是可以很好的解決下面將要介紹的揹包問題。
b,揹包問題描述:給定n個物品,每個物品i都有兩個屬性,即價值pi和重量wi,問題是希望找出具有最大價值的物品子集,同時這些物品的的重量之和不超過給定的總重量w。如果對於每個物品要麼全部接受要麼拒絕(即物品不可分割),則這類問題是0-1揹包問題。這裡我要介紹的是允許取某個物品的一部分。該問題的動機就是假如我要進行一次旅行,有n個候選食物的集合s和只有乙個載重w的揹包,每種食物的價值不同。允許每中食品只取一部分。我該如何選取食物,在總重量不大於w的情況下使總的價值量最大。用數學模型描述如下:
c,演算法原理處理過程:
1)首先計算出每種食物的單位價值即vi=pi/wi; 2)
為了使揹包中總價值最大,每次優先選取vi值大的食物裝進揹包中;
3)直到取到最後一種食物且滿足總重量不大於給定的w;
4)其中最後一種食物允許只取一部分,演算法結束。
d,演算法實現:
#include "iostream"
using namespace std;
#define size 50
#define min -65535
int main()
knapsack(w, p, n, mw);
return 0; }
//貪心法解揹包問題
void knapsack(int w, int p, int n, float mw)
} v[index] = min;//把選中的物品從集合中去掉
if(w[index] > (mw - cw))
else
} cout<
執行結果:
e,複雜度分析
時間複雜度:上述演算法實現中,查詢物品集合中最大價值量的物品時間複雜度為o(n),而對於給定的w最多迴圈n次,因此上述演算法時間複雜度為o(n^2)。
揹包問題 (貪心法)
問題 給定n個物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,揹包問題是如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大。注意和0 1揹包的區別,在揹包問題中,可以將某種物品的一部分裝入揹包中,但不可以重複裝入。想法 每次裝入單位價值最大的物品。物品重量放在陣列w n 中,價值存放...
貪心法 揹包問題
貪心是一種解題策略,也是一種解題思想 使用貪心方法需要注意區域性最優與全域性最優的關係,選擇當前狀態的區域性最優並不一定能推導出問題的全域性最優 利用貪心策略解題,需要解決兩個問題 該題是否適合於用貪心策略求解 如何選擇貪心標準,以得到問題的最優 較優解 關於貪心法可以解決的揹包問題,這個物品是可以...
演算法 貪心法 揹包問題
對於揹包問題 這個是揹包問題,不是0 1揹包問題 貪心有三種策略 1 從物品中選取價值最大的放入。2 從物品中選區重量最小的放入。3 選取物品的價值與重量的比值大的放入。第一第二種不能保證得到最優解,第三種有的資料說也不能保證得到最優解,但是能得到最優的近似解。這裡選取第三種方法 1 先選取比值最大...