http://acm.hdu.edu.cn/submit.php?pid=1864
注意细节
#include <iostream> #include<cstdio> #include<cstring> using namespace std; int dp[4000000]; int c[500]; inline int max(int a,int b) { return a>b?a:b; } int main() { double m1; int n; while(scanf("%lf%d",&m1,&n),n) { int i,j; int cas=1; char str; memset(dp,0,sizeof(dp)); memset(c,0,sizeof(c)); int m=(int)(m1*100); for(i=1;i<=n;i++) { int k;int ta=0,tb=0,tc=0; scanf("%d",&k); for(j=0;j<k;j++) { double t1; scanf(" %c:%lf",&str,&t1); getchar(); if(str=='A') ta+=(int)(t1*100); else if(str=='B') tb+=(int)(t1*100); else if(str=='C') tc+=(int)(t1*100); else break; } if(j==k&&ta<=60000&&tb<=60000&&tc<=60000) { int t=ta+tb+tc; if(t<=100000) c[cas++]=t; } } for(i=1;i<=cas;i++) { for(j=m;j>=c[i];j--) dp[j]=max(dp[j],dp[j-c[i]]+c[i]); } printf("%.2f\n",(double)dp[m]/100); } return 0; }