演算法設計與分析 貪心演算法

2021-10-25 22:09:59 字數 1512 閱讀 8429

分解:將原問題求解過程劃分為連續的若干個決策階段

決策:在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模

合併:將各個階段的區域性解合併為原問題的乙個全域性最優解

greedy(c)//c是問題的輸入集合即候選集合

; //初始解集合為空集

while(not solution(s));

c=c-; //減去乙個與x關聯的集合,縮小問題的規模

}return s;

}

1.數學歸納法

2.交換論證法

問題描述:已經有n種物品及乙個可以容納m質量的揹包,其中,每種物品i的質量為wi,價值為pi,假定將物品i的一部分xi放入揹包將會得到pixi的效益,這裡,0≤xi≤1,pi>0,怎樣使裝入揹包物品的總效益值最大?

目標函式:d=max ∑pi xi

約束條件:∑ wi xi ≤ m

策略一:優先選擇價值最大

策略二:優先選擇質量最輕

策略三:優先選擇價值率(價值/重量)最大

小數揹包問題設計思想:

1.預處理:把物品按照價值率進行排列

2.選擇第乙個物品,根據貪心策略,首先選擇價值率大的物品,並記錄該物品裝入的重量

3.貪心選擇後續的活動,依次掃瞄每乙個物品,在沒有超出揹包容量的條件下,盡可能多的裝入當前價值率最高的物品,並記錄該物品裝入的重量

揹包問題:n=3,m=20,(p1,p2,p3)=(25,24,15),(w1,w2,w3)=(18,15,10),其中四個可行解如表所示:

//定義的資料結構如下

typedef

struct

//輸入:揹包承載量m,存放n種物品的效益值p,質量w資訊的陣列instance[ ]

//輸出:n種物品被裝入揹包的份額x[ ],揹包中的物品總效益值

float

knapsack_greedy

(float m,object instance,

float x,

int n)

quick_sort

(instance,n)

;//按照效益質量比值v的非遞增次序排序物品

m = m;

//揹包可承載的質量

for(i =

0; i

)else

//最後一種物品裝入份額

}return p;

}

時間複雜度主要由快速排序演算法決定 o(nlogn)

演算法設計與分析 貪心演算法

time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...

演算法設計與分析 貪心演算法

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

演算法設計與分析9 貪心演算法

木棒加工問題 現有n根木棒,已知它們的長度和重量。要用一部木工機一根一根地加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模版的。木工機需要的準備時間如下 1 第一根木棒需要1min的準備時間 2 在加工了一根長為l 重為w的木棒之後,接著加工一根長為l l l 重為 ...