use the cnt as the limit.
#include <string.h> #include <stdio.h> double num[50],sum; double dp[50]; double a,b,c; int cnt; int main(){ double res,tmp,tt; int q,n,i,j,k; char type; int success; while(~scanf("%lf%d",&sum,&n)){ if(n==0) break; cnt=0; for(i=0;i<n;++i){ scanf("%d",&k); tt=0; a=b=c=0; success=1; for(j=0;j<k;++j){ getchar(); scanf("%c:%lf",&type,&tmp); if((type=='A'||type=='B'||type=='C' )&&(600.0>=tmp)){ if(type=='A') a+=tmp; else if(type=='B') b+=tmp; else if(type=='C') c+=tmp; if(a<=600&&b<=600&&c<=600){ tt+=tmp; }else success=0; }else success=0; } if(success==1&&1000.0>=tt){ num[cnt++]=tt; } } memset(dp,0,sizeof(dp)); for(i=0;i<cnt;++i) for(j=cnt-1;j>=0;--j) dp[j]=dp[j]>dp[j-1]+num[i]?dp[j]:dp[j-1]+num[i]; res=0; for(i=cnt-1;i>=0;--i) if(sum>=dp[i]){ if(dp[i]>res){ res=dp[i]; } } printf("%.2lf ",res); } return 0; }