1. 程式人生 > >用分支定界(branch and bound)法解裝箱問題

用分支定界(branch and bound)法解裝箱問題

裝箱問題
[ 問題描述 ]
有一個箱子容量為 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
=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;
}

最後輸出結果為9