部分揹包問題 貪心演算法

2022-07-31 13:06:09 字數 2454 閱讀 3147

有n個商品,每個商品的重量為wi,**為:pi,現有乙個揹包,最多能裝m的重量.其中(0<=i

問:怎樣裝能使包中裝入的商品價值最高(對於每個商品可以只裝該商品的一部分)

#include 

<

stdio.h

>

#include

<

iostream

>

#include

<

stdlib.h

>

#define

maxsize 100

//假設物體總數

#define

m 15

//揹包的載荷能力

using

namespace

std;

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

void

greedy(

float

w, float

x, int

sortresult,

intn)

for(i =0

; i

<

n; i++)

if(w[temp]

>

c)x[temp] =1

;//若合適則取出

c -=

w[temp];

//將容量相應的改變}if

(i <=

n)//

使揹包充滿

return;}

void

sort(

float

x, int

sortresult,

intn)

for(i =0

; i

<

n; i++)

}//對w[i]作標記

if(sortresult[index] ==0

)}cout

<<

"對映陣列sortresult:

"<<

endl;

for(i =0

; i

<

n; i++)

cout

<<

sortresult[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;}

intmain()

sort(x, sortresult, n);

//得到對映陣列,陣列中按照物品單位重量的價值從大到小的順序做了標記,方便取物品

greedy(w, x, sortresult, n);

//按照對映陣列標記的順序取物品,和總重量比較

output(x, n);

return0;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型來...

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

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

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

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