現有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...