要求確定乙個合理的裝載方案將n個貨櫃裝入兩艘船,如果有,找出一種方案
我們之前用貪心做過一艘船的最優裝載問題(將盡可能多的貨櫃裝入),即將重量小的貨櫃先裝。
那麼我們看看這個題,如果用貪心的話能不能做出來。
假設兩艘船載重量為100 100,
假設有5個物體,重量為20 30 40 50 60,如果我們用貪心演算法,那麼第一艘船裝入的物品為 20 30 40,共三個
那麼另一艘船只能放入50,共乙個
此時我們發現貪心演算法明顯出了問題
因為可以第一艘船放入:20 30 50
第二艘船放入40 60
此時剛好完全裝入
所以我們需要另一種方法:
將第一艘船裝入盡可能重的貨櫃
當剩餘貨櫃重量小於第二艘船時,那麼能夠裝下所有貨櫃。
如何使第一艘船裝入盡可能多的貨櫃呢?
這有點類似於0-1揹包問題
但我們會使用回溯法,因為某些情況下回溯法優於動態規劃
此時解空間為子集樹
當所在狀態的重量加上所在點重量小於載重量時(越界判斷),我們就可以進入左子樹進行搜尋嘗試。
當所在狀態的重量加上所有剩餘重量大於當前最優值時**(剪枝)**,我們就可以進入右子樹進行判斷。
#include
#define n 100
int c1,c2;
//裝載量
int n;
//物品數目
int w[n]
;//物品重量
int flag[n]=;
//標記
int r=0;
//總餘量
int cw=0;
//當前重量
int bw=0;
//最優解
int choose[n]
;//儲存陣列
void
backtrack
(int i)
}return;}
r-=w[i]
;//更新剩餘容量
if(cw+w[i]
<=c1)
if(cw+r>bw)
r+=w[i]
;//恢復餘量
}int
main()
backtrack(1
);if(sum-bw<=c2)
printf
("\nc2放的物品為:");
for(i=
1;i<=n;i++)}
else
}
裝載問題 回溯演算法
題目描述 有一批共n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi。裝載問題要求確定,是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船。如果有,找出一種裝載方案。題目出自 計算機演算法設計與分析 第三版 王曉東 這是乙個典型的回溯演算法問題。如下 template clas...
回溯演算法 裝載問題
給定n個貨櫃要裝上一艘載重量為c的輪船,其中貨櫃i的重量為wi。貨櫃裝載問題要求確定在不超過輪船載重量的前提下,將盡可能多的貨櫃裝上輪船 貪心演算法中的裝載問題討論的是裝載件數 本題討論的是最大裝載重量。由於貨櫃問題是從n個貨櫃裡選擇一部分貨櫃,假設解向量為x x1,x2,xn 其中xi xi 1表...
演算法設計與分析 裝載問題(回溯)
題目 描述 有兩艘船,載重量分別是c1 c2,n個貨櫃,重量是wi i 1 n 且所有貨櫃的總重量不超過c1 c2。確定是否有可能將所有貨櫃全部裝入兩艘船。輸入 多個測例,每個測例的輸入佔兩行。第一行一次是c1 c2和n n 10 第二行n個整數表示wi i 1 n n等於0標誌輸入結束。輸出 對於...