貪心法求解部分揹包問題

2021-10-10 19:55:45 字數 2604 閱讀 5901

揹包問題:給定乙個載重為m的揹包,及n個質量為wi、價值為pi的物體,1<=i<=n,要求把物體裝滿揹包,且使得揹包內的物體價值最大。

假設:xi是物體i被裝入揹包的部分,0<=xi<=1。當xi=0時,表示物體i沒有被裝入揹包;當xi=1時,表示物體i被全部裝入揹包;當xi處於0~1之間,表示物體i的一部分被裝入揹包。根據問題的要求,可以列出下列的約束方程和目標函式:

![在這裡插入描述](
於是,問題歸結為尋找乙個滿足約束方程並使目標函式達到最大的解向量x=(x1,x2,x3…xn)

為使目標函式的值增加最快,一種方法是優先選擇價值最大的物體裝入揹包,這樣當最後乙個物體裝不下時,選擇乙個適當的xi<1的物體裝入,把揹包裝滿。但是,使用這種方法,不一定能夠達到最準的目的。如果所選擇的物體重量很大,使得揹包載重量的消耗速度太快,以致後續能夠裝入揹包的物體迅速減少,從而便得繼續裝入揹包的物體在滿足了約束力程的要求以後,無法達到目標函式的要求。因此,最好是選擇既使目標函式的值增加最快,又使揹包載重量的消耗較慢的物體裝入揹包。達到這個目的的一種方法是優先選擇價值重量比最大的物體裝入揹包。基於上述考慮,定義下面的資料結構:

typedef

struct

wp;wp instance[max]

;float x[max]

;

/*

貪婪發求解揹包問題

輸入:揹包載重m,存放物品的價值p、質量m資訊的陣列instance[ ],物體的數量n

輸出:n個物體被裝入揹包的分量x[i],揹包中物體的總價值p

*/float

knapsack_greedy

(float m,wp instance,

float x,

int n)

mysort

(instance,n)

; m=m;

for(i=

0;i)else

}return p;

}

完整程式**:

#include

#define max 100

typedef

struct

wp;wp instance[max]

;float x[max]

;void

mysort

(wp instance,

int n)

printf

("輸出排序後的物品的\n");

printf

("價值\t\t");

printf

("質量\t\t");

printf

("價質比\n");

for(i=

0;i)printf

("%f\t%f\t%f\n"

,instance[i]

.p,instance[i]

.w,instance[i]

.v);

printf

("\n");

}/*貪婪發求解揹包問題

輸入:揹包載重m,存放物品的價值p、質量m資訊的陣列instance[ ],物體的數量n

輸出:n個物體被裝入揹包的分量x[i],揹包中物體的總價值p

*/float

knapsack_greedy

(float m,wp instance,

float x,

int n)

mysort

(instance,n)

; m=m;

for(i=

0;i)else

}return p;

}int

main

(void);

float p=0;

int i=0;

int nwp=max;

//物品的最大數量

float c=max;

//揹包可以承載的最大質量

printf

("請輸入揹包可以承載的重量:");

scanf

("%f"

,&c)

;printf

("請輸入物品的總數量:");

scanf

("%d"

,&nwp)

;printf

("\n");

printf

("請輸入物體的:\n");

//只是為了看得方便

printf

("價值\t");

printf

("質量\n");

for(i=

0;i)//輸入每個物品的價值和質量

scanf

("%f%f"

,&obj[i]

.p,&obj[i]

.w);

p=knapsack_greedy

(c,obj,x,nwp)

;printf

("該揹包的最大價值是%f\n"

,p);

return0;

}

執行結果:

揹包問題 (貪心法)

問題 給定n個物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,揹包問題是如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大。注意和0 1揹包的區別,在揹包問題中,可以將某種物品的一部分裝入揹包中,但不可以重複裝入。想法 每次裝入單位價值最大的物品。物品重量放在陣列w n 中,價值存放...

貪心法 揹包問題

貪心是一種解題策略,也是一種解題思想 使用貪心方法需要注意區域性最優與全域性最優的關係,選擇當前狀態的區域性最優並不一定能推導出問題的全域性最優 利用貪心策略解題,需要解決兩個問題 該題是否適合於用貪心策略求解 如何選擇貪心標準,以得到問題的最優 較優解 關於貪心法可以解決的揹包問題,這個物品是可以...

貪心法之揹包問題

a,貪心演算法 該演算法應用於優化問題,即問題涉及通過一組配置來找出定義在這些配置上的目標函式的最小值或者最大值。為了求解給定的優化問題需要進行一系列的選擇,這個序列開始於某些易於理解的起始配置,然後從當前可能的配置中,反覆做出看起來是最好的決策。這個特點說明,從乙個良好的定義的配置開始,通過一系列...