回溯法求解01背包问题
算法描述
【问题描述】
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。
设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且满足重量限制具有最大的价值。
C语言实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<stdio.h> float w[100],p[100]; int x1[100],x[100],m,n; float max=0,total=0;
int knap(int i) { int j; float sum=0; if(i==n+1) { for(j=1;j<=n;j++) sum=sum+x1[j]*p[j]; if(sum>max) { max=sum; for(j=1;j<=n;j++) x[j]=x1[j]; } return 0; } x1[i]=0; knap(i+1); if(total+w[i]<=m) { x1[i]=1; total=total+w[i]; knap(i+1); x1[i]=0; total=total-w[i]; } return 0; }
int main() { int s=0,sum=0,i; printf("请输入背包的总容量m和物品件数n的值:"); scanf("%d %d",&m,&n); for(i=1;i<=n;i++) { printf("请输入第%d件物品的重量和价值:",i); scanf("%f %f",&w[i],&p[i]); s+=w[i]; sum+=p[i]; } if(s<=m) { printf("%d %d",m,sum); printf("最大价值为%d",sum); return 0; } else knap(1); for(i=1;i<=n;i++) printf("x%d=%d\n",i+1,x[i]); printf("最大价值为%.2f", max); return 0; }
|
运行截图
