思路:简单DP
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
double c[32];//存每张合法发票的价值
double k[3];//寸每张发票A,B,C种类物品的价值
double q;
int n,m;
char a,b;//a为输入的大写字母,b为“:”
double price;//输入的价值
int dp[3100000];
int main()
{
while(cin>>q>>n&&n)
{
int count=0;
for(int i=1;i<=n;i++)
{
k[0]=k[1]=k[2]=0;//ABC三种每种的总价值初始化
cin>>m;
double sum=0;
bool ok=1;
for(int j=1;j<=m;j++)
{
cin>>a>>b>>price;
sum+=price;
if(a!='A'&&a!='B'&&a!='C')//还有其它大写字母
{
ok=0;
continue;
}
k[a-'A']+=price;//每张发票上某一种类的总价值
if(sum>1000||k[a-'A']>600)
ok=0;
}
if(ok)//符合题意的发票
c[count++]=sum;
}
memset(dp,0,sizeof(dp));
int maxn=(int)(q*100);
for(int i=0;i<count;i++)//01背包部分,每个数据扩大100倍化为整型处理
for(int j=maxn;j>=(int)(c[i]*100);j--)
{
if(dp[j]<dp[j-(int)(c[i]*100)]+(int)(c[i]*100))
dp[j]=dp[j-(int)(c[i]*100)]+(int)(c[i]*100);
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<double(dp[maxn]/100.0)<<endl;
}
return 0;
}