C 趣味問題丨如何利用貪心演算法實現搬水果問題?

2021-10-12 10:14:41 字數 3284 閱讀 5490

c++ 搬水果貪心演算法實現**

題目描述:

在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。當然經過 n‐1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。

假定每個水果重量都為 1,並且已知水果的種類數和每種水果的數目,你的任務是設計出合併的次序方案,使小明耗費的體力最少,並輸出這個最小的體力耗費值。例如有 3 種水果,數目依次為 1,2,9。可以先將 1,2 堆合併,新堆數目為3,耗費體力為 3。然後將新堆與原先的第三堆合併得到新的堆,耗費體力為 12。所以小明總共耗費體力=3+12=15,可以證明 15 為最小的體力耗費值。

輸入:每組資料輸入包括兩行,第一行是乙個整數 n(1<=n<=10000),表示水果的種類數,如果 n 等於 0 表示輸入結束,且不用處理。第二行包含 n 個整數,用空格分隔,第 i 個整數(1<=ai<=1000)是第 i 種水果的數目。

輸出:對於每組輸入,輸出乙個整數並換行,這個值也就是最小的體力耗費值。輸入資料保證這個值小於 2^31。

樣例輸入:

9 1 2

樣例輸出:

(2)這種問題考慮到可以使用貪心演算法(每次都將最小的一堆水果進行合併),問題與赫夫曼編碼類似。**也是根據huffman編碼演算法的基礎上的改動,實現**為:

ps:**只是實現其功能,沒有優化。使用vector作為容器,存放耗費的體力值,每執行一次extract_min操作就會遍歷一次vector,實際當中效率是很低的,所以實際應用當中應該採用 最小堆結構 來存放耗費的體力值,這樣會節省很多時間。

#include

#include

using namespace std;

* 得到佇列中的最小元素

intextract_min(vector& v)

if(v.size() == 0)

return-1;

inti=0, min_pos = 0;

vector::iterator iter = v.begin();

vector::iterator min_iter = v.begin();

for(; iter!=v.end(); ++iter)

if((*iter)

min_iter = iter;

intmin_value = *(min_iter);

v.erase(min_iter);

returnmin_value;

*計算過程,類似於構建哈夫曼樹

intmovefruit(intdata, intn)

//將元素初始化到佇列中

vectorv;

inti=0;

for(i=0; iv.push_back(data[i]);

inttotal = 0;//總體力消耗值

//依次組合

intleft= 0, right=0, parent=0;//每次合併一堆,選取佇列中最小的兩個數作為左孩子和右孩子

for(i=1; ileft= extract_min(v);

right= extract_min(v);

parent = left+right;

total += parent;

v.push_back(parent);

returntotal;

intmain()

intn;

while(cin>>n)

if(n == 0)

break;

int* data = new int[n];

inti=0;

for(; icin>>data[i];

cout

#include

#include

using namespace std;

* 得到佇列中的最小元素

int extract_min(vector& v)

if(v.size() == 0)

return -1;

int i=0, min_pos = 0;

vector::iterator iter = v.begin();

vector::iterator min_iter = v.begin();

for(; iter!=v.end(); ++iter)

if((*iter)

min_iter = iter;

int min_value = *(min_iter);

v.erase(min_iter);

return min_value;

*計算過程,類似於構建哈夫曼樹

int movefruit(int data, int n)

//將元素初始化到佇列中

vectorv;

int i=0;

for(i=0; iv.push_back(data[i]);

int total = 0;//總體力消耗值

//依次組合

int left = 0, right=0, parent=0;//每次合併一堆,選取佇列中最小的兩個數作為左孩子和右孩子

最後,如果你也想成為程式設計師,想要快速掌握程式設計,趕緊加入學習企鵝圈子!程式設計學習書籍:

刪數問題 貪心演算法 C

題目描述 給定乙個高精度正整數a,去掉其中k個數字後按原左右次序將組成乙個新的正整數。對給定的a,k尋找一種方案,使得剩下的數字組成的新數最小。此題可用貪心演算法進行求解 具體思路 當k 1時,對於n位數構成的數刪除哪一位,使得剩下的資料最小。刪除滿足如下條件的a i 它是第乙個a i a i 1 ...

貪心演算法 活動安排問題(C )

該演算法的貪心選擇的意義 基本步驟 用i代表第i個活動,s i 代表第i個活動開始時間,f i 代表第i個活動的結束時間,然後按結束時間從早到晚排序。系統依次檢查活動i是否與當前已選擇的所有活動相容。若相容,活動i加入已選擇活動的集合中,否則,不選擇活動i,而繼續檢查下一活動與集合a中活動的相容性。...

利用貪心演算法求解揹包問題 python實現

求解思路 求出各物品價值與體積之比,由高到低排序,盡可能放價值比高的物品。author xuke 實現功能 利用貪心演算法求解揹包問題 各物品的體積列表 v 各物品的價值列表 val 各物品編號 num 各物品 體重 v val 輸入揹包體積 vs eval input 揹包體積為 輸入物品種類數 ...