貪心演算法解決部分揹包問題

2021-06-05 01:25:00 字數 2011 閱讀 1832

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所做出的僅是在某種意義上的區域性最優解。

貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

貪心演算法的基本思路如下:

1.建立數學模型來描述問題。

2.把求解的問題分成若干個子問題。

3.對每一子問題求解,得到子問題的區域性最優解。

4.把子問題的解區域性最優解合成原來解問題的乙個解。

部分揹包問題:

給定乙個最大載重量為m的卡車和n種食品,有食鹽,白糖,大公尺等。已知第 i 種食品的最多擁有wi 公斤,其商品價值為vi元/公斤,程式設計確定乙個裝貨方案,使得裝入卡車中的所有物品總價值最大。

分析:因為每乙個物品都可以分割成單位塊,單位塊的利益越大顯然總收益越大,所以它區域性最優滿足全域性最優,可以用貪心法解答。方法如下:

(1)先將單位塊收益按從大到小進行排序;

(2)初始化揹包的剩餘體積和當前價值;

(3)從前到後考慮所有物品:a.如果可以完全放入,當前價值加上物品總價值,剩餘體積減去物品總體積;b.如果可以部分放進,當前價值加上物品價值*剩餘體積,使剩餘體積為0. 

利用貪心策略解題,需要解決兩個問題:

一、確定問題是否能用貪心策略求解;一般來說,適用於貪心策略求解的問題具有以下特點:

① 可通過區域性的貪心選擇來達到問題的全域性最優解。運用貪心策略解題,一般來說需要一步步的進行多次的貪心選擇。在經過一次貪心選擇之後,原問題將變成乙個相似的,但規模更小的問題,而後的每一步都是當前看似最佳的選擇,且每乙個選擇都僅做一次。

② 原問題的最優解包含子問題的最優解,即問題具有最優子結構的性質。在揹包問題中,第一次選擇單位質量最大的貨物,它是第乙個子問題的最優解,第二次選擇剩下的貨物中單位重量價值最大的貨物,同樣是第二個子問題的最優解,依次類推。

二、如何選擇乙個貪心標準?正確的貪心標準可以得到問題的最優解,在確定採用貪心策略解決問題時,不能隨意的判斷貪心標準是否正確,尤其不要被表面上看似正確的貪心標準所迷惑。在得出貪心標準之後應給予嚴格的數學證明。

貪心一般都伴隨著使用排序

c語言演算法:

#include

#include

#define maxsize 100 //假設物體總數

#define m 20 //揹包的載荷能力

//演算法核心,貪心演算法

void greedy(float w, float x, int sortresult, int n)

for (i = 0; i < n; i++)

x[temp] = 1;//若合適則取出

cu -= w[temp];//將容量相應的改變

}if (i <= n)//使揹包充滿

return;

}void sort(float temparray, int sortresult, int n)

for (i = 0; i < n; i++)

}//對w[i]作標記排序

if (sortresult[index] == 0)

}//修改效益最低的sortresult[i]標記

for (i = 0; i < n; i++)

}return;

}//得到本演算法的所有輸入資訊

void getdata(float p, float w, int *n)

printf("now please input array of w :\n");

for (i = 0; i < (*n); i++)

return;

}void output(float x, int n)

printf("\n");

for (i = 0; i < n; i++)

return;

}int main()

sort(x, sortresult, n);

greedy(w, x, sortresult, n);

output(x, n);

system("pause");}

貪心演算法解決部分揹包問題

給定乙個最大容量為m的揹包和n種物品,有食鹽 白糖 大公尺等。已知第i種食品最多有wi公斤,其價值為vi元 公斤,請確定乙個裝貨方案,使得裝入揹包中的所有食品的總價值最大。考慮到物品可以分塊進行裝載,即每乙個物品按重量可分割,所以採用單位價值大的先裝滿的原則進行貪心,如下 include inclu...

部分揹包問題 貪心演算法

有n個商品,每個商品的重量為wi,為 pi,現有乙個揹包,最多能裝 的重量 其中 0 i 問 怎樣裝能使包中裝入的商品價值最高 對於每個商品可以只裝該商品的一部分 include stdio.h include iostream include stdlib.h define maxsize 100...

貪心演算法之 部分揹包問題

對了,貪心演算法還有一類部分揹包問題也挺經典 下面以洛谷p2240為例,阿里巴巴走進了裝滿寶藏的藏寶洞。藏寶洞裡面有 n n le 100 n n 100 堆金幣,第 ii 堆金幣的總重量和總價值分別是 mi,vi 1 mi,vi 100 阿里巴巴有乙個承重量為 t t le 1000 t t 10...