C 分支限界法求解揹包問題

2021-06-18 18:32:00 字數 1354 閱讀 3906

1.beibao.h檔案**如下:

#ifndef beibao_h

#define beibao_h

#include //子空間中節點型別

class bbnode

bbnode()

};class heapnode

heapnode()

int compareto(heapnode o)

};class element

element(int idd,double dd)

int compareto(element x)

}} ;

#endif

2.測試**

#include using namespace std;

//子空間中節點型別

#include "beibao.h"

double c=30;

const int n=3;

double *w;

double *p;

double cw;

double cp;

int *bestx;

maxheap * heap;

//上界函式bound計算結點所相應價值的上界

double bound(int i)

//裝填剩餘容量裝滿揹包

if(i<=n)

b=b+p[i]/w[i]*cleft;

return b;

}//addlivenode將乙個新的活結點插入到子集樹和優先佇列中

void addlivenode(double up,double pp,double ww,int lev,bbnode* par,bool ch)

double maxknapsack()

up=bound(i+1);

if(up>=bestp)

addlivenode(up,cp,cw,i+1,enode,false);

heapnode node =heap->removemax();

enode=node.livenode;

cw=node.weight;

cp=node.profit;

up=node.upperprofit;

i=node.level;

} for(int j=n;j>0;j--)

return cp;

} double knapsack(double *pp,double *ww,double cc,int *xx)

*****物品價值陣列:v=

*****最優值:=50

*****選中的物品是:0 1 1

分支限界法求解01揹包問題

使用優先佇列,求最大價值 首先按照價效比排序 bound函式表示當前狀態之後的選擇都是理想的,這樣能到達的理想最大值 每個節點儲存物品在樹中的層次,表示已經對多少個物品做出了選擇,當前狀態放入揹包的總價值和重量。include using namespace std const int n 110 ...

0 1揹包問題 分支限界法

0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...

分支限界法 0 1揹包問題

分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...