不得不说自己是非常的马虎,抛开算法不说,只是输入我都写错了,让我改了半个小时,算法还是没想出来,参考别人的要来好长时间,然后的然后发现自己题读错了,而且错了好多,唉唉,咋这么马虎啊,需要多练习啊! 这个题属于01背包的问题,与hdoj2602有相似的地方!#include<stdio.h> #include<stdlib.h> #include<string.h> struct fun{ int x; char s; float price; float sum; }a[95]; int main() { float q,c[31],ans,su,b,e,f; int n,i,j,t; char w; while(scanf("%f%d",&q,&n)&&n) { j=1; while(n--) { scanf("%d",&a[j].x); t=0; a[j].sum=0; e=0;b=0;f=0; while(a[j].x--) { getchar(); scanf("%c%c%f",&a[j].s,&w,&a[j].price); if(a[j].s=='A') b+=a[j].price; else if(a[j].s=='B') e+=a[j].price; else if(a[j].s=='C') f=f+a[j].price; else t=1; if(b>600||e>600||f>600||e+b+f>1000) t=1; } if(t==1) a[j].sum=0; else a[j].sum=e+b+f; j++; } t=j-1; memset(c,0,sizeof(c)); su=0; for(i=1;i<=t;i++) { ans=0; for(j=1;j<i;j++) { if((c[j]>ans)&&(c[j]+a[i].sum<=q)) ans=c[j]; } c[i]=a[i].sum+ans; if(c[i]>su) su=c[i]; } printf("%.2f\n",su); } return 0; } 状态转移方程:best[i]=max(best[j],best[j]+w[i])(best[j]+w[i]<q&&j<i)