演算法作業(裝載問題)

2021-08-30 13:46:50 字數 1534 閱讀 5948

有n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中第i個貨櫃的重量為wi,要求確定是否有乙個合理的裝載方案可將這個貨櫃裝上這2艘輪船。如果有,找出一種裝載方案。

注意,在滿足的條件下才可能將這個貨櫃裝上這2艘輪船。

輸入有若干組測試資料(不超過20組)。

每組測試資料有3行:其第1行上是貨櫃個數n,(n<20),第2行上有n個整數w1、w2、…、wn,整數之間用乙個空格分開,這n個整數依次表示這n個貨櫃的重量,接下來的一行上有2個整數c1、c2,表示這兩艘船的載重量,(0現要求對輸入中的每組測試資料,輸出2行:

在第1行上輸出「case #」,其中「#」是測試資料的組號(從1開始)。

在第2行上輸出具體裝載結果:如不能裝載則輸出「no」;否則輸出乙個整數bestw及乙個由0或1構成的字串x1x2…xn,其中bestw表示第一艘船能裝的最大總載重量,x1x2…xn是對應於bestw的具體裝載方案,xi=1表示第i個貨櫃裝在第一艘船上,而xi=0表示第i個貨櫃不裝在第一艘船上。

對應於bestw的具體裝載方案可能不唯一,如重量分別為10、40、40的3個貨櫃,若兩船的載重量都是50,那麼有裝載方案110和101兩種。為使輸出結果可操作,我們約定長為n的0-1字串以字典序最大的那個為符合要求的裝載方案。

如可能,將計算時間複雜性限制在$ o(2^n)$

310 40 40

50 50

320 40 40

50 50

case 1

50 110

case 2

no本次實驗的重點在於將o(n

∗2n)

o(n*2^n)

o(n∗2n

)的複雜度優化到$ o(2^n)$,我採用的方法是,在dfs過程中動態的更新路徑best。具體實現是:在dfs時記錄x[i]和best[i],在回溯的過程中,用x[i]來更新best[i]。

dfs結束以後,看記錄的最多可裝載量ans+c2與總量之間的關係,如果ans+c2[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-zqbs876g-1584347058752)(./捕獲.png)]

#include using namespace std;

const int maxn=100;

int n;

int a[maxn];

int c1,c2;

int x[maxn],ans,best[maxn];

int cw;

int ii,r;

void dfs(int i)

r-=a[i];

if(cw+a[i]<=c1)

cw-=a[i];

}if(cw+r>ans)

}r+=a[i];

}int main()

cw=0,ans=0;

r=s;

scanf("%d%d",&c1,&c2);

dfs(1);

printf("case %d\n",++case);

if(ans+c2實驗體會

通過本次實驗,我對回溯的理解又加深了,也體會到了剪支對搜尋演算法非常有用。

裝載問題 回溯演算法

題目描述 有一批共n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi。裝載問題要求確定,是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船。如果有,找出一種裝載方案。題目出自 計算機演算法設計與分析 第三版 王曉東 這是乙個典型的回溯演算法問題。如下 template clas...

回溯演算法 裝載問題

給定n個貨櫃要裝上一艘載重量為c的輪船,其中貨櫃i的重量為wi。貨櫃裝載問題要求確定在不超過輪船載重量的前提下,將盡可能多的貨櫃裝上輪船 貪心演算法中的裝載問題討論的是裝載件數 本題討論的是最大裝載重量。由於貨櫃問題是從n個貨櫃裡選擇一部分貨櫃,假設解向量為x x1,x2,xn 其中xi xi 1表...

noj演算法題 裝載問題

裝載問題 回溯,子集樹 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 有兩艘船,載重量分別是c1 c2,n個貨櫃,重量是wi i 1 n 且所有貨櫃的總重量不超過c1 c2。確定是否有可能將所有貨櫃全部裝入兩艘船。輸入 多個測例,每個測例的輸入佔兩行。第一行一次是c1 c...