1,對貪心演算法的理解
(1)貪心演算法是通過一系列的選擇來得到問題的解,所做的每個選擇都是當前狀態下區域性最好的選擇,即貪心選擇。
(2)貪心演算法有兩個重要的性質:貪心選擇性質和最優子結構性質
其中貪心選擇性質,所求問題的整體最優解可以通過一系列區域性最優的選擇來得到
就是說當前問題可以通過選擇最好的那個元素(比如貨幣找零問題,總能夠通過選擇當前小於總的找零數的最大面額的鈔票來得到最優解)來解決問題
所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,換句話說,當考慮做何種選擇的時候,我們只考慮對當前問題最佳的選擇而不考慮子問題的結果。這是貪心演算法可行的第乙個基本要素。
貪心演算法以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化為規模更小的子問題。
對於乙個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優解。
2,請選擇一道作業題目說明你的演算法滿足貪心選擇性質
例題:4-1 程式儲存問題 (90分)
設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1≤i≤n。 程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案, 使得能夠在磁帶上儲存盡可能多的程式。 對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。
第一行是2 個正整數,分別表示檔案個數n和磁帶的長度l。接下來的1行中,有n個正整數,表示程式存放在磁帶上的長度。
輸出最多可以儲存的程式數。
在這裡給出一組輸入。例如:
6 50
2 3 13 8 80 20
在這裡給出相應的輸出。例如:
5
**:
#include#includeusing namespace std;int a[1000],n,l;
int main()
sort(a,a+n);
int sum=0,count=0;
for(int i=0;il)
count+=1;
}cout《演算法思想是:先將程式放在磁帶上的長度按從小到大排序,如果最短的程式都比磁帶長度長,則輸出零;迴圈中每次挑選陣列中剩下的最短的程式,直到放不下為止。
貪心選擇就是每次挑選最短的程式,這樣才能保證存入的程式數量最多。
證明我的貪心選擇(反證法)
磁帶長度為
50 ,6個程式長度分別為
2 10 13 8 80 27
假如不是每次都選最短的
假如選了 10 13 27 能放三個程式
實際上,選擇用 2 和 8 代替上面的13,就能放下 2 8 10 13 四個程式,比原來的選擇更優,說明我的假設是錯的,即每次選擇最小的選擇是正確
的。
3,請說明在本章學習過程中遇到的問題及結對程式設計的情況
(1)遇到的問題:有時候不知道如何做貪心選擇,不知道什麼樣的選擇才合適。
(2)結對程式設計情況:上機課一起求解4-2 刪數問題時,原因是貪心策略選錯了,導致有一部分測試點過不了。課上有一起討論,互相幫助,第三題4-3 最優合併問題 是搭檔教我思路,按著思路我自己把**打出來了。
演算法第四章作業
1.我對貪心演算法的理解 貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態...
演算法第四章作業
一 對貪心演算法的理解 貪心演算法的基本要素是 貪心選擇性質和最優子結構性質 貪心選擇每次選取當前最優解,可以依賴以往的選擇,但絕不依賴於將來所做的選擇,也不依賴於子問題的解。貪心演算法通常以自頂向下的方式進行。二 汽車加油問題的貪心選擇性質 汽車應選擇在能到達的前提下離自己最遠的加油站進行加油 i...
演算法第四章作業
我的理解 主要是在貪心二字上面,但是重要的是在哪些方面上貪心,是解決題目的最重要的思路。因此要考慮貪心選擇性質和子結構性質 貪心選擇性質 從區域性的最優解擴充套件到整體的最優解 最優子結構性質 整體的最優解包含子問題的最優解 由於要計算汽車從起點到終點的最少加油次數 故,每次可以盡可能多的在滿油量內...