貪心演算法(裝箱問題)

2021-08-21 15:59:45 字數 1462 閱讀 9294

貪心演算法的基本思想是找出整體當中每個小的區域性的最優解,並且將所有的這些區域性最優解合起來形成整體上的乙個最優解。因此能夠使用貪心演算法的問題必須滿足下面的兩個性質:

1.整體的最優解可以通過區域性的最優解來求出;

2.乙個整體能夠被分為多個區域性,並且這些區域性都能夠求出最優解。

3.區域性最優解不一定能得到整體最優解。

貪心演算法之裝箱問題:

有若干個體積為v的箱子,有n個物品體積為v1,v2,v3,v4。。。。

要求:將所有物品裝入箱子中,使開啟的箱子盡可能少。

演算法描述:把所有物品按體積降序排序,每次取出乙個物品(該物品為當前體積最大的物品),遍歷所有已開啟箱子,將該箱子放入乙個較早開啟的箱子,若沒有箱子能放下,則開啟乙個新箱子。

完整**實現:

#include#include#define v 10   //箱子的總容量 

//物品資訊型別宣告

typedef structelemg;

//物品結點型別宣告

typedef struct nodegoodslink;

//箱子結點型別宣告

typedef struct boxboxlink;

//對物品體積降序排序(氣泡排序)

void bubblesort(elemg *g,int n)

} }}

//把物品裝入箱子中

boxlink* packingbox(elemg *g,int n)

newg=(goodslink*)malloc(sizeof(goodslink)); //建立乙個物品結點

newg->link=null;

newg->gno=g[i].gno; //存入目前最大體積的物品的編號

for(q=p->hg;q&&q->link;q=q->link); //遍歷物品鍊錶

if(!q)else

p->remainder-=g[i].gv; //物品結點放入箱子結點以後,將該箱子結點剩餘容量減去放入的物品的體積

} return hbox; }

//輸出每個箱子存放物品的編號 和剩餘容量

void printlink(boxlink* hbox,int n)

printf("\t剩餘容量為:%d",p->remainder);

printf("\n");

} }

int main(void)

}

bubblesort(g,n); //排序

hbox=packingbox(g,n); //裝箱

printlink(hbox,n); //輸出每個箱子存放物品的編號

}

執行結果如下:

貪心演算法 裝箱問題

貪心演算法中必須設定乙個貪心準則 來尋求每一步的最優解,但最後往往不是問題的整體最優解。問題 假設有n個物品,其體積為v1,v2,v3,v4.v n,有若干個體積為v的箱子 理論物品的體積應該小於箱子的體積 要求把所有物品全部裝入箱子中,要求開啟的箱子數最少。分析 怎樣合理化分配才能使得開啟的箱子數...

貪心演算法 裝箱問題

描述 乙個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為11,22,33,44,55,66。這些產品通常使用乙個 66h 的長方體包裹包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需要有乙個好的程式幫他們解決...

貪心演算法之裝箱問題

貪心準則 1.貪心準則設計演算法過程的每一步都是最優解 2.貪心準則一旦被設計,中途不可改變 裝箱問題 問題描述 1.有若干個體積為v的箱子 2.有n個物品,體積分別為 v1,v2,v3 要求 將所有物品都裝入箱子中,使箱子盡可能的少 貪心準則 1.將所有物品按照體積降序排列 2.每次取出乙個物品 ...