#include <stdio.h>
int n,C,bestp;//物品的个数,背包的总容量,最大价值
int w[20],p[20],x[20],bestx[20];
//数组x记录某个物品选与不选,w[i]、p[i]:第i个物品的重量、价值
int bound(int i,int cw,int cp)//剪枝函数
{
int cr=C-cw;//cr-背包内剩余容量
int B=cp;//B-当前价值的副本
while(i<=n && w[i]<cr)
{
cr-=w[i];
B+=p[i];
i++;
}
if(i<=n)
B+=p[i]*cr/w[i];//加上理论上第i个物品的理论价值
return B;
}
void back(int i,int cw,int cp)
{//从第i个物品考虑,cw-当前已有重量,cp-当前包内物品价值
if(i==n+1)
{
if(cp>bestp)
{
bestp=cp;
for(i=1;i<=n;i++)
bestx[i]=x[i];
}
return ;
}
if(cw+w[i]<=C)
{
x[i]=1;cw=0;cw+=w[i];
cp+=p[i];
back(i+1,cw,cp);
cw-=w[i];cp-=p[i];
}
if(bound(i+1,cw,cp)>bestp)
{
x[i]=0;back(i+1,cw,cp);
}
}
void main()
{
int i;
n=3;C=30;//3个物品装入容量为C的背包
w[1]=16; w[2]=15; w[3]=15;//每个物品的重量
p[1]=45; p[2]=25; p[3]=25;//每个物品的价值
back(1,0,0);
for(i=1;i<=3;i++)
if(x[i]==1)
printf("装入 %d号物品\n",i);
}
0-1背包问题(回溯思想)
最新推荐文章于 2022-06-03 17:44:55 发布