//採用剪枝求解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();
}