演算法學習 貪心演算法實踐

2021-08-13 16:32:40 字數 1096 閱讀 4177

完成日期:2017.11.21

1. 實踐題目

程式儲存問題

2. 問題描述

設有 n 個程式 要存放在長度為 l 的磁帶上。程式i存放在磁帶上的長度是 li , 1 ≤ i ≤ n 。要求確定這 n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。

3. 演算法描述

資料結構:count——當前可儲存的程式個數 a——存放程式的長度 n——程式的個數 l——磁帶的長度

(1)先將陣列的元素按非降序排序。

(2)遍歷n個程式,判斷程式是否可取:

如果磁帶的長度l大於程式的長度a[j],則該程式可取,那麼可儲存的程式個數count值++,同時更新l值,l -= a[j]。

其餘情況表示該程式不可取,說明該程式之後的程式均不可取,那麼退出迴圈。

(3)輸出count值。

4. 演算法時間及空間複雜度分析

時間複雜度:

sort(a,a+n);的時間複雜度為o(nlogn),

for(int i=0;i

5. 程式**

#include 

#include

using

namespace

std;

int storage(int*a, int n, int l) else

break;

} return count;

}int main()

6. 程式執行截圖

7. 心得體會

只要理解貪心演算法的思想,再結合起來仔細分析題目,問題就迎難而解了。就程式儲存問題而言,既然要求儲存最多個程式,那麼只要把較小的程式乙個個加起來,直到大於總長度就可以了,這就是貪心演算法的思想,總是做出對當前最有利的選擇。一開始程式一直不能通過是因為後續的for迴圈中忘了更新l的值,所以造成了錯誤。由此得知,以後要明白自己所寫的每一行**的作用,寫**時同時在腦海裡一定要非常清晰自己的思路、用到哪些變數等等,這樣才不會出現這些細節錯誤。

演算法學習 貪心演算法

所謂貪心演算法,是在對問題求解時,總是做出在當前看來最好的選擇。即,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,就是某個狀態以前的過程不會影響以後的狀態,只與當前的狀態有關。貪心...

演算法學習 貪心演算法

想通過這篇部落格來分享一下學習貪心演算法和動態規劃的過程 首先什麼是貪心演算法?翻譯 話就是用簡單粗暴的方式,以最少的代價 占用的時間和空間 得出結果。比如某麵包店有a b c三種大小的麵包,其中a麵包可以提供10點能量售價5元,b麵包可以提供8點能量售價3元,c麵包可以提供2點能量售價1元。現在有...

貪心演算法學習

基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備...