#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int N=30;//全局变量,物品数量
const int bag=N;//全局变量,背包承重量
int max_value=0;//全局变量,记录能获得的最大价值
int count=0;//全局变量,用于记录到达叶节点的次数
int a[N],v[N],w[N],r[N+1];//全局变量,分别保存0-1方案,物品价值,物品重量,剩余总价值
int backpack(int t,int now_v,int now_w)
{//t表示递归层数,now_v表示当前层所累积的价值,now_w表示当前层所累积的重量
int i;
if(t>N-1)//当递归到达叶子节点时
{
printf("找到一个方案");
for(i=0;i<N;i++)
{
printf("%d",a[i]);
}
if(now_w>bag)//判断方案是否超重
{
printf("\n该方案总价%d,总重%d,超重!不可行!!!\n",now_v,now_w);
}
else//如果不超重
{
if(now_v>max_value)//判断该方案所获得的价值是不是更优
{
max_value=now_v;//更新最优解
}
printf("\n该方案总价%d,总重%d,可行\n",now_v,now_w);
}
count++;
}
else
{
for(i=0;i<=1;i++)
{
a[t]=i;//记录当前物品选或不选
now_v=now_v+v[t]*i;//根据0-1值累加价值
now_w=now_w+w[t]*i;//根据0-1值累加重量
if(now_w<=bag && max_value<now_v+r[t+1])
backpack(t+1,now_v,now_w);//递归到下一层
}
}
return max_value;//返回最大价值
}
int main()
{
int i,start,end;
printf("背包最大承重%d公斤\n",bag);
for(i=0;i<N;i++)//随机生成价值和重量范围1-5
{
v[i]=rand()%5+1;
w[i]=rand()%5+1;
printf("物品%d,价值%d,重量%d\n",i,v[i],w[i]);
}
r[N]=0;
for(i=N-1;i>=0;i--)//计算所有情况下剩余物品的总价值
{
r[i]=r[i+1]+v[i];
}
start=clock();
printf("能获得的最大价值为:%d\n",backpack(0,0,0));
end=clock();
printf("检查方案%d个,",count);
printf("耗时:%dms\n",end-start);
return 0;
}