回溯求解01揹包問題的算法

//採用剪枝求解01揹包問題的算法
#include stdio.h
#define MAXN 20					//最多物品數
問題表示
int n=4;						//4種物品
int W=6;						//限制重量爲6
int w[]={0,5,3,2,1};			//存放4個物品重量,不用下標0元素
int v[]={0,4,4,3,1};			//存放4個物品價值,不用下標0元素
求解結果表示
int x[MAXN];					//存放最終解
int maxv; 						//存放最優解的總價值
void dfs(int i,int tw,int tv,int op[]) //考慮第i個物品
{
	if (in)					//找到一個葉子結點
	{	if (tw==W && tvmaxv) 	//找到一個滿足條件的更優解,保存它
		{	maxv=tv;
			for (int j=1;j=n;j++)
				x[j]=op[j];
		}
	}
	else						//尚未找完所有物品
	{	if (tw+w[i]=W)			//左孩子結點剪枝:滿足條件時才放入第i個物品
		{	op[i]=1;			//選取第i個物品
			dfs(i+1,tw+w[i],tv+v[i],op);
		}
		op[i]=0;				//不選取第i個物品,回溯
		dfs(i+1,tw,tv,op);
	}
}
void dispasolution()	//輸出最優解
{	int i;
	printf(最佳裝填方案是n);
	for (i=1;i=n;i++)
		if (x[i]==1)
			printf(  選取第%d個物品n,i);
	printf(總重量=%d,總價值=%dn,W,maxv);
}
void main()
{
	int op[MAXN];				//存放臨時解
	dfs(1,0,0,op);
	dispasolution();
}

 

發佈了98 篇原創文章 · 獲贊 35 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章