// 可拆背包问题,c741 #include <stdio.h> #define N 100 void main() {float p[N],w[N],x[N],c,cw,s,h; int i,j,n; printf(" input n:"); scanf("%d",&n); // 输入已知条件 printf("input c:"); scanf("%f",&c); for(i=1;i<=n;i++) {printf("input w%d,p%d:",i,i); scanf("%f,%f",&w[i],&p[i]); } for(i=1;i<=n-1;i++) // 对n件物品按单位重量的效益从大到小排序 for(j=i+1;j<=n;j++) if(p[i]/w[i]<p[j]/w[j]) { h=p[i];p[i]=p[j]; p[j]=h; h=w[i];w[i]=w[j]; w[j]=h; } cw=c;s=0; // cw为背包还可装的重量 for(i=1;i<=n;i++) {if(w[i]>cw) break; x[i]=1.0; // 若w(i)<=cw,整体装入 cw=cw-w[i]; s=s+p[i]; } x[i]=(float)(cw/w[i]); // 若w(i)>cw,装入一部分x(i) s=s+p[i]*x[i]; printf("装包:"); // 输出装包结果 for(i=1;i<=n;i++) if(x[i]<1) break; else printf(" 装入重量为%5.1f效益为%5.1f的物品.",w[i],p[i]); if(x[i]>0 && x[i]<1) printf(" 装入重量为%5.1f效益为%5.1f的物品百分之%5.1f.",w[i], p[i],x[i]*100); printf(" 所得最大效益为:%7.1f ",s); }