01背包,注意每项报销额是每一类总和不超过600,不是每一个不小于600,应该是我没看明白
#include<bits/stdc++.h>
using namespace std;
struct node
{
int va,we;
};
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int n,k;
char c;
double q,temp;
while (~scanf("%lf%d",&q,&n)&&n)
{
long money[35]={0};
long *ans=(long*)calloc(10000000,sizeof(long));
int i,j;
for( i=0;i<n;i++)
{
scanf("%d",&k);
double sum1=0,sum2=0,sum3=0,sum=0;
for(j=0;j<k;j++)
{
getchar();
scanf("%c:%lf",&c,&temp);
if(c=='A')sum1+=temp;
else if(c=='B') sum2+=temp;
else if(c=='C')sum3+=temp;
else break;
}
sum=sum1+sum2+sum3;
if(j<k)money[i]=0;
else if(sum<=1000&&sum1<=600&&sum2<=600&&sum3<=600)
money[i]=(long)(sum*100);
}
for(int i=0;i<n;i++)
{
if(money[i])
{
for(int j=(int)(q*100);j>=money[i];j--)
{
ans[j]=max(ans[j],ans[j-money[i]]+money[i]);
}
}
}
double output=ans[(long)(q*100)];
printf("%.2f\n",output/100);
}
return 0;
}