《貪心算法實驗報告》 計科2001 陳梓聰 20201003024
貪心算法的思想:通過第四章學習了貪心算法,我們知道,貪心算法總是做出在當下看來最好的選擇,通過每個最優的選擇來得出原問題的最優解。
貪心算法的使用條件:貪心算法有的時候並不能得出最優解,只有在滿足一下兩個條件的時候才能使用:1.貪心性質:整體的最優解可通過一系列局部最優解達到,並且每次的選擇可以依賴以前做出的選擇,但不能依賴於以后的選擇。2.最優子結構: 問題整體的最優解包括子問題的最優解。
貪心算法的局限性:貪心算法有他的局限性,有的時候我們選擇局部的最優解,但是它對與全局並非最優解,就比如硬幣找零問題。但是我們依然可以用我們上一章所學的動態規划思想來解決。
貪心算法的分析過程:首先,我們需要確定我們的貪心策略,只有正確的貪心策略才能得出我們的結論。下面是我們的實驗題。
4-1程序儲存問題:
設有n 個程序{1,2,…, n }要存放在長度為L的磁帶上。程序i存放在磁帶上的長度是 li,1≤i≤n。 程序存儲問題要求確定這n 個程序在磁帶上的一個存儲方案, 使得能夠在磁帶上存儲盡可能多的程序。 對於給定的n個程序存放在磁帶上的長度,計算磁帶上最多可以存儲的程序數。
輸入格式:第一行是2 個正整數,分別表示文件個數n和磁帶的長度L。接下來的1行中,有n個正整數,表示程序存放在磁帶上的長度。
輸出格式:輸出最多可以存儲的程序數。
輸入:6 50 輸出: 5
2 3 13 8 80 20
#include <iostream> #include <algorithm> using namespace std; int main() { int n, l, res; cin >> n >> l; int *a = new int [n]; for(int i = 0; i < n; i ++) { cin >> a[i]; } sort(a, a + n); for(int i = 0; i < n; i ++) { l -= a[i]; if(l < 0) { res = i; break; } } cout << res; return 0; }
貪心策略:我的貪心策略是將還未存入磁帶中最小的程序放入磁帶,直到放入一個程序后,再放入下一個程序時程序的總長度>L,此時能存下最多程序數。
心得與體會:貪心算法有的時候不能得到問題的最優解,但是其思想簡單,代碼思路清晰明了,能使用的時候不失為一種很好的方法。