#include <stdio.h>
#include <stdlib.h>
#define N 5
#define W 10
/*
2 6
2 3
6 5
5 4
4 6
测试用例
*/
void initialization(int *w,int *v,int *x,int *finalx)
{
int i=0;
w[0]=0;
v[0]=0;
x[0]=0;
printf("请输入背包的质量和价值:\n");
for(i=1;i<=N;i++)
{
scanf("%d%d",&w[i],&v[i]);
}
for(i=1;i<=N;i++)
{
x[i]=0;
finalx[i]=0;
}
}
void record(int *x,int* finalx)
{
int i=0;
for(i=1;i<=N;i++)
{
finalx[i]=x[i];
}
}
void output(int *finalx,int bestp)
{
int i=0;
printf("装入背包的方案为:\n将");
for(i=1;i<=N;i++)
{
if(finalx[i]==1)
{
printf("%d号 ",i);
}
}
printf("物品装入背包\n");
printf("装入背包的物品的最大价值是%d\n",bestp);
}
int bound(int i,int cp,int *v,int *p_bestp)
{
int sum=0;
while (i <= N )
{
sum+=v[i];
i ++;
}
if ((cp+sum)>(*p_bestp))
{
return 1;
}
else
{
return 0;
}
}
void backtrack(int t,int *w,int *v,int *x,int cw,int cp,int *p_bestp,int *finalx){
if (t > N)
{
if(cp>*p_bestp)
{
*p_bestp=cp;
record(x,finalx);
}
return;
}
if (cw + w[t] <= W)
{
x[t]=1 ;
cw += w[t] ;
cp += v[t] ;
backtrack(t+1,w,v,x,cw,cp,p_bestp,finalx);
cw -= w[t];
cp -= v[t];
}
if (bound(t+1,cp,v,p_bestp))
{
x[t]=0;
backtrack(t+1,w,v,x,cw,cp,p_bestp,finalx);
}
}
int main()
{
int x[N+1],v[N+1],w[N+1],finalx[N+1],*p_bestp=NULL;
int bestp=0;
p_bestp=&bestp;
initialization(w,v,x,finalx);
backtrack(1,w,v,x,0,0,p_bestp,finalx);
output(finalx,bestp);
return 0;
}
回溯法求解0-1背包问题
最新推荐文章于 2021-11-05 22:35:21 发布