设有N个物体和一个背包,物体i的重量wi,价值为pi,背包的载重量为M,若将物体i放入背包中,只有价值pi,求找打一个方案 使得放入背包中的总价值L最高。 eg.w=(20,15,15) p=(40,25,25) M=30 则L=50 #include<stdio.h> struct { int weight; int value; } goods[10];//存储每个物体的信息 int opt[10];//用来表示该物体是否放入包中 int opt1[10]; int all_weight=0;//记录包中目前的总重量 int all_value=0;//记录包中物体总价值 void find(int i,int n,int limit,int osweight);//i表示第i个物品 void main() { int n,i,limit; int a,b; printf("输入物体的总数:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("输入第%d物体的重量和价值:",i+1); scanf("%d %d",&a,&b); goods[i].weight=a; goods[i].value=b; } for(i=0;i<10;i++) opt[i]=0; printf("输入限制重量:"); scanf("%d",&limit); find(0,n,limit,0); printf("放入背包的物品编号为:"); for(i=0;i<n;i++) if(opt1[i]==1) { all_weight=all_weight+goods[i].weight; printf("%4d",i+1); } printf("/n"); printf("背包总重量为:"); printf("%4d/n",all_weight); printf("背包总价值为:"); printf("%4d/n",all_value); } void find(int i,int n,int limit,int osweight) { int k; if(i>=n) { int sum=0; for(k=0;k<n;k++) if(opt[k]==1) sum=sum+goods[k].value; if(sum>all_value) { all_value=sum; for(k=0;k<n;k++) opt1[k]=opt[k]; } } else { if(osweight+goods[i].weight<=limit) { opt[i]=1; find(i+1,n,limit,osweight+goods[i].weight); } opt[i]=0; find(i+1,n,limit,osweight); } }