(贪心)背包问题
1.最優裝載問題。
給出n個物體,第i個物體重量為wi。選擇盡量多的物體,使得總重量不 超過C。
由于只關心物體的數量,所以裝重的沒有裝輕的劃算。只需把所有物體按重量從小到大 排序,依次選擇每個物體,直到裝不下為止。
2.部分背包問題。
有n個物體,第i個物體的重量為wi,價值為vi。在總重量不超過C的情 況下讓總價值盡量高。每一個物體都可以只取走一部分,價值和重量按比例計算。
本題在上一題的基礎上增加了價值,所以不能簡單地像上題那樣先拿輕的(輕的可能價 值也小),也不能先拿價值大的(可能它特別重),而應該綜合考慮兩個因素。一種直觀的 貪心策略是:優先拿“價值除以重量的值”最大的,直到重量和正好為C。
注意:由于每個物體可以只拿一部分,因此一定可以讓總重量恰好為C(或者全部拿走 重量也不足C),而且除了最后一個以外,所有的物體要么不拿,要么拿走全部。
3.乘船問題。
有n個人,第i個人重量為wi。每艘船的最大載重量均為C,且最多只能乘兩 個人。用最少的船裝載所有人。
考慮最輕的人i,他應該和誰一起坐呢?如果每個人都無法和他一起坐船,則唯一的方 案就是每人坐一艘船。否則,他應該選擇能和他一起坐船的人中最重的 一個j。這樣的方法是貪心的,因此它只是讓“眼前”的浪費最少??梢杂梅醋C法說明。
情況1:i不和任何一個人坐同一艘船,那么可以把j拉過來和他一起坐,總船數不會增 加(而且可能會減少)。
情況2:i和另外一人k同船。由貪心策略,j是“可以和i一起坐船的人”中最重的,因 此k比j輕。把j和k交換后k所在的船仍然不會超重(因為k比j輕),而i和j所在的船也不會超 重(由貪心法過程),因此所得到的新解不會更差。
由此可見,貪心法不會丟失最優解。最后說一下程序實現。在剛才的分析中,比j更重 的人只能每人坐一艘船。這樣,只需用兩個下標i和j分別表示當前考慮的最輕的人和最重的 人,每次先將j往左移動,直到i和j可以共坐一艘船,然后將i加1,j減1,并重復上述操作。
總結
- 上一篇: axure 鼠标变成手,Axure教程|
- 下一篇: 荣耀x10max能不能升级为鸿蒙,荣耀终