01背包 水
注意判断好发票是否可用即可
#include "stdio.h"
#include "math.h"
#include "string.h"
int num[31],dp[3001000];
int main()
{
int n,a,m,b,c,k,ok,i,j;
double x,q,sum;
char ch,str[101];
while (scanf("%lf%d",&q,&n)!=EOF)
{
if (n==0) break;
k=0;
while (n--)
{
scanf("%d",&m);
a=b=c=sum=0;
ok=1;
for (i=1;i<=m;i++)
{
getchar();
scanf("%c:%lf",&ch,&x);
if (ch!='A' && ch!='B' && ch!='C') { ok=0; gets(str);break;}
if (ch=='A') a+=x;
if (ch=='B') b+=x;
if (ch=='C') c+=x;
sum+=x;
}
if (ok==0) continue;;
if (a>600 || b>600 || c>600 || sum>1000) continue;
num[++k]=sum*100;
}
memset(dp,0,sizeof(dp));
q*=100;
dp[0]=1;
for (i=1;i<=k;i++)
for (j=(int)q;j>=num[i];j--)
if (dp[j-num[i]]==1) dp[j]=1;
for (i=q;i>=0;i--)
if (dp[i]==1)
{
printf("%.2lf\n",i/100.0);
break;
}
}
return 0;
}