最優裝載問題

2021-09-02 06:23:51 字數 1267 閱讀 6393

現有n個貨櫃要裝進兩艘載重分別為c1,c2的船,其中第i個貨櫃重w[i],並且題目保證  i=1nw

i≤c1+c2 , 問是否存在乙個合理的裝載方案,使得這n個貨櫃都裝進兩艘船,若有請找出一種方案。

題目分析:

方法1:對於每個貨櫃,都有3種狀態:裝到船1,裝到船2,或者不裝。按照這個思想我們可以列舉所有的n位3進製數,0,1,2分別代表三種狀態,每個數判斷是否可以滿足題目限制,進而找到合適的方案。因為每次判斷需要o(n)的複雜度,位三進製數有3^n個,總的複雜度為o(n*2^n)。

方法2:上面的方法當然也可以搜尋來實現,搜尋樹位乙個深度位n的完全三叉樹,呼叫回溯法可以解決。

方法3:題目畢竟只有兩艘船,試想如果我讓第一艘船盡可能的滿載,那麼剩下的必然全部放在第二艘船上,就可判斷其可行性,那麼問題就在於怎麼求出第一艘船的最大載重。很容易想到可以用c1作為揹包容量,每個物品的w[i]同時作為重量和價值,求個0-1揹包的最大價值裝載就可以啦。當然也可以想回溯法求揹包的最優解,每個物品裝不裝,2種狀態複雜度位2^n.

下面給出回溯法的解決方案。

非遞迴法解釋:

考慮何時回溯:即當繼續往下走不會對結果有更新作用的時候既要回溯,回溯到**去呢?

回溯到可能對結果仍有貢獻為止。

#include using namespace std;

const int maxn = 1000;

int w[maxn],x[maxn],bwx[maxn];

int n,c1,c2,r,cw,bw;

void load(int i)

r -= w[i];

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

if(cw + r > bw)

r += w[i];

}void load()

if(i == n+1)

else

while(r + cw <= bw)

if(i == 0)

x[i] = 0;

cw -= w[i];

r -= w[i];

i++;}}

}int main()

load();

//load(1);

printf("%d\n",bw);

for(int i = 1; i <= n; i++)

puts("");

return 0;}/*

10500 121

21 54 21 45 1316 65 545 1 20 54

*/

最優裝載問題

題目描述 給定一艘容量為c的船,給定一批貨物,貨物i的重量是wi,要求在船不超重的前提下,將盡可能多的貨物裝上船。思路 盡可能多的裝上船,就像活動安排問題一樣,先對貨櫃的重量從小到大排序,在貨櫃重量不超過輪船載重量的情況下先裝輕的,裝上之後在用乙個布林型陣列賦值為1,表示裝上船,方便輸出 inclu...

貪心,最優裝載問題

問題描述 有一批貨櫃要裝上一艘載重量為c的輪船,其中貨櫃i的重量為wi。最優裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的貨櫃裝上輪船。分析 可用貪心演算法求解,採用重量最輕者先裝的貪心選擇策略,可產生最優裝載問題的最優解。具體演算法描述如下 public static float loa...

最優裝載問題 貪心

問題描述 有一批貨櫃要裝上一艘載重量為c的輪船。其中貨櫃i的重量為wi。最優裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的貨櫃裝上輪船。程式設計任務 對於給定的n個貨櫃和輪船的載重量c,程式設計計算裝入最多時的貨櫃個數。輸入 輸入由多組測試資料組成。每組測試資料輸入的第1行中有2個正整數n...