問題:
有一批共n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi,且貨櫃總重小於等於輪船總載重。
裝載問題要求確定是否有乙個合理的裝載方案可將這批貨櫃裝上這2艘輪船。如果有,找出一種裝載方案。
分析:
假如要將貨櫃裝進兩艘輪船,那麼只需將第一艘輪船盡可能裝滿,剩下的盡量裝進第二艘就可以了。
因此原問題被分解為兩個模式相同的問題:從所有貨櫃中挑選出使得貨輪1載重最大的那些,然後再從剩下的貨櫃中選出使得貨輪2載重最大的那些。這是價值等於重量的特殊的0-1揹包問題。
0-1揹包可以用動態規劃求解,複雜度為o(nc),也可以用回溯求解,複雜度o(2n)在某些情況下會更優。
在本題中,採用子集樹,約束函式為當前選擇的貨物總重量小於載重,限界函式為當前選擇的貨物的總重量加上還沒有檢查的貨物的總重量比當前的最優解大。
在實際**寫的時候,對於這種特殊的1-0子樹,可以左判約束右判界,即擴充套件節點為左孩子的時候,只判斷約束函式,因為左代表著選擇這一層的貨物,約束函式的值可能發生改變,限界函式的值不會改變;右代表著不選,約束函式不變,限界函式可能改變。這樣就少了點判斷,減少點複雜度。
**:
#include
using
namespace std;
#define maxn 105
// 物品重量
int w[maxn]
;// 最大載重量
int c;
// 當前最優解
int bestw =-1
;// 結果記錄陣列
bool res[maxn]
;// 計算當前所選物品的s總重量
intsum
(int pos,
int n)
}return tmp;
}// 約束函式
bool
constrain
(int pos,
int n)
// 限界函式
bool
bound
(int pos,
int n)
return
sum(pos,n)
+ tmp > bestw ?
true
:false;}
// 遞迴法求解最大裝載問題
void
loadingtraceback
(int pos,
int n)
else
// 右孩子,不選
res[pos]=0
;// 假如滿足限界,那就繼續if(
bound
(pos,n))}
}// 迭代法求解最大裝載問題
void
loadingiterate
(int pos,
int n)
else}}
else
else}}
} pos--
; f[pos]++;
}}intmain()
至於0-1揹包問題,將約束函式和限界函式做出修改即可。
#include
using
namespace std;
#define maxn 105
// 物品重量
int w[maxn]
;// 物品價值
int v[maxn]
;// 最大載重量
int c;
// 當前最優解
int bestv =-1
;// 結果記錄陣列
bool res[maxn]
;// 計算當前所選物品的總價值
intsum
(int pos)
}return tmp;
}// 約束函式
bool
constrain
(int pos,
int n)
}return tmp > c ?
false
:true;}
// 限界函式
bool
bound
(int pos,
int n)
return
sum(pos)
+ tmp > bestv ?
true
:false;}
// 遞迴法求解0-1揹包問題
void
loadingtraceback
(int pos,
int n)
else
// 右孩子,不選
res[pos]=0
;// 假如滿足限界,那就繼續if(
bound
(pos,n))}
}// 迭代法求解0-1揹包問題
void
loadingiterate
(int pos,
int n)
else}}
else
else}}
} pos--
; f[pos]++;
}}intmain()
回溯法 求解裝載問題(類似0 1揹包)
要求 採用回溯法 採用剪枝條件 include include include define maxn 20 最多貨櫃個數 int n,w,int maxw maxw 存放最優解的總重量 int x maxn x 存放最優解向量 int minm 32767 minm 存放最優解的貨櫃個數,初始為最...
回溯法 0 1揹包問題
0 1揹包問題 給定n種物品和一揹包.物品i的重量是wi,其價值為ui,揹包的容量為c.問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 0 1揹包是子集合選取問題,一般情況下0 1揹包是個np問題.第一步 確定解空間 裝入哪幾種物品 第二步 確定易於搜尋的解空間結構 可以用陣列p,w...
0 1揹包問題 回溯法
0 1揹包問題 回溯法 一 專案描述 每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。二 演算法設計 a.物品有n種,揹包容量為c,分別用p i 和w i 儲存第i種物品的價值和重量,用x i...