链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1864
#include <bits/stdc++.h>
using namespace std;
const int maxn =3e6+10;
int dp[maxn],w[35];
int main()
{
int n,num,flag,cnt;
char str,b;
double m,f;
double A,B,C;
int sum;
while(cin>>m>>n&&n)
{
cnt=0;
sum=(int)(m*100);//转化为整数,乘100是为了背包计算
memset(dp,0,sizeof dp);
for(int i=0; i<n; i++)
{
flag =0;
A = 0;
B = 0;
C = 0;
cin>>num;
for(int j=0; j<num; j++)
{
cin>>str>>b>>f;
if(str=='A')
A+=f;
else if(str=='B')
B+=f;
else if(str=='C')
C+=f;
else
flag = 1;
}
if(!flag&&A<=600&&B<=600&&C<=600&&A+B+C<=1000)//三类都小于600并且总合小于1000并且没有其他类型
w[cnt++]=(A+B+C)*100;
}
for(int i=0; i<cnt; i++)
{
for(int j=sum; j>=w[i]; j--) //01 背包计算 体积和价格一致而已
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
double money= dp[sum]/100.0;
printf("%.2lf\n",money);
}
return 0;
}