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 揹包體積為 輸入物品種類數 ...