用分支定界(branch and bound)法解裝箱問題
阿新 • • 發佈:2019-02-18
裝箱問題
[ 問題描述 ]
有一個箱子容量為 v( 正整數, 0≤v≤20000) ,同時有 n 個物品 (0≤n≤30) ,每個物品有一個體積 ( 正整數 ) 。要求從 n 個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
[ 樣例 ]
#include <list>
usingnamespace std;
#define MAX 3
constint CAP =10;//最大容量
constint box[MAX]={4,8,5};//三個箱子
int main()
{
int temp=0,level=-1,best=0;
int curVal=0,parentVal=0,expectVal=0;
list<int> queue;
queue.push_back(-1);//-1表示一層
queue.push_back(parentVal);
do
{
parentVal=queue.front();
queue.pop_front();
if(parentVal !=-1)
{
//left child
curVal=parentVal+box[level];
if(curVal>best&&curVal<=CAP)
{
best=curVal;
//最後一層節點沒必要加入佇列
if(level<MAX-1)
queue.push_back(curVal);
}
//right child
curVal=parentVal;
for(int i=level+1;i<MAX;i++)
temp+=box[i];
expectVal=curVal+temp;
//預計最大值若大於目前最佳值,則加入佇列;否則不加入,即剪枝
if(expectVal>best&&level<MAX-1)
queue.push_back(curVal);
}else{
if(level<MAX-1)
queue.push_back(-1);
level++;
}
}while(level!=MAX&&queue.empty()!=true);
/*while(queue.empty()!=true)
{
cout<<queue.front()<<endl;
queue.pop_front();
}*/
cout<<best<<endl;
return0;
}
[ 問題描述 ]
有一個箱子容量為 v( 正整數, 0≤v≤20000) ,同時有 n 個物品 (0≤n≤30) ,每個物品有一個體積 ( 正整數 ) 。要求從 n 個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
[ 樣例 ]
輸入:
10 一個整數,表示箱子容量
3 一個整數,表示有 n 個物品
4 接下來 n 行,分別表示這 n 個物品的各自體積。
8
5
輸出:
1 一個整數,表示箱子剩餘空間。
#include <iostream>#include <list>
usingnamespace std;
#define MAX 3
constint CAP
constint box[MAX]={4,8,5};//三個箱子
int main()
{
int temp=0,level=-1,best=0;
int curVal=0,parentVal=0,expectVal=0;
list<int> queue;
queue.push_back(-1);//-1表示一層
queue.push_back(parentVal);
do
{
parentVal=queue.front();
queue.pop_front();
if(parentVal
{
//left child
curVal=parentVal+box[level];
if(curVal>best&&curVal<=CAP)
{
best=curVal;
//最後一層節點沒必要加入佇列
if(level<MAX-1)
queue.push_back(curVal);
}
curVal=parentVal;
for(int i=level+1;i<MAX;i++)
temp+=box[i];
expectVal=curVal+temp;
//預計最大值若大於目前最佳值,則加入佇列;否則不加入,即剪枝
if(expectVal>best&&level<MAX-1)
queue.push_back(curVal);
}else{
if(level<MAX-1)
queue.push_back(-1);
level++;
}
}while(level!=MAX&&queue.empty()!=true);
/*while(queue.empty()!=true)
{
cout<<queue.front()<<endl;
queue.pop_front();
}*/
cout<<best<<endl;
return0;
}
最後輸出結果為9