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