演算法設計 裝載問題(兩輪船)(回溯)

2021-10-05 21:24:22 字數 1477 閱讀 3986

要求確定乙個合理的裝載方案將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標誌輸入結束。輸出 對於...