HDU1864报销发票

来源:互联网 发布:数控车床编程教学视频 编辑:程序博客网 时间:2024/04/29 08:43
//01背包,因为保留两位小数,所以以报销的最大额乘以100作为背包
#include<stdio.h>
#include<string.h>
int dp[3000005];
int main()
{
 int i,j,k,n,m,Q;
 int v[35];
 char c;
 double q,s;
 while(scanf("%lf%d",&q,&n),n)
 {
  memset(dp,0,sizeof(dp));
  int cnt=0;
  for(i=0;i<n;i++)
  {
   scanf("%d",&m);
   getchar();
   int flag=1;
   int A=0,B=0,C=0;
   for(j=0;j<m;j++)
   {
      scanf("%c:%lf",&c,&s);
      getchar();
     // printf("%c %lf\n",c,s);
    if(c=='A') A=A+(int)(s*100);
      else if(c=='B') B=B+(int)(s*100);
      else if(c=='C') C=C+(int)(s*100);
      else flag=0;
       if(A+B+C>100000||A>60000||B>60000||C>60000) flag=0;
   }
  if(flag)v[cnt++]=A+B+C;
  }
  Q=(int)(q*100);
      for(i=0;i<cnt;i++)
    for(j=Q;j>=v[i];j--)
     dp[j]=dp[j]>dp[j-v[i]]+v[i]?dp[j]:dp[j-v[i]]+v[i];
    printf("%.2lf\n",(double)dp[Q]/100);
 }
 return 0;
}