a,b,c分别代表所报销类目的钱数,到最后整合为a+b+c ,那样就不会出现这张发票报销了一半,另一半无法报销的情况无法判断,有时候应该把事物整合成一个整体再进行处理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[3000005];
int money[35];
int main()
{
float x,y;
int total,n,k,a,b,c,l,v,flag;
char ch;
while(scanf("%f%d",&x,&n)&&n)
{
memset(dp,0,sizeof(dp));
total=x*100;
l=0;
for(int i=0;i<n;i++)
{
scanf("%d",&k);
a=b=c=0;
flag=1;
while(k--)
{
scanf(" %c:%f",&ch,&y);
v=y*100;
if(ch=='A') a+=v;
else if(ch=='B') b+=v;
else if(ch=='C') c+=v;
else {flag=0;break;}
}
if(a+b+c<=100000&&a<=60000&&b<=60000&&c<=60000&&flag) money[l++]=a+b+c;
}
for(int i=0;i<l;i++)
{
for(int j=total;j>=money[i];j--)
{
dp[j]=max(dp[j],dp[j-money[i]]+money[i]);
}
}
printf("%.2f\n",dp[total]/100.0);
}
return 0;
}