http://acm.hdu.edu.cn/showproblem.php?pid=1864
<span style="font-size:12px;">#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,QQ;
double Q;
char str[110];
struct pro
{
char name;
double value;
} node[35];
int sum[35],dp[3000010];
void onezeropack(){
memset(dp, 0, sizeof(dp));
for(int i=0; i<n; i++)
for(int j=QQ; j>=sum[i]; j--)
dp[j] = max(dp[j], dp[j - sum[i]] + sum[i]);
}
int main()
{
// freopen("in.txt", "r", stdin);
while(scanf("%lf%d",&Q,&n) != EOF && n)
{
QQ = Q * 100;
memset(sum, 0, sizeof(sum));
for(int i=0; i<n; i++)
{
int m;
pro tmp;
scanf("%d",&m);
int a = 0, b = 0, c = 0, flag = 1;
for(int i=0; i<m; i++)
{
getchar();
scanf("%c:%lf",&tmp.name,&tmp.value);
tmp.value *= 100;
if(tmp.name == 'A')
a += tmp.value;
else if(tmp.name == 'B')
b += tmp.value;
else if(tmp.name == 'C')
c += tmp.value;
else flag = false;
}
if(a > 60000 || b > 60000 || c > 60000) flag = false;
if(a + b + c > 100000) flag = false;
if(flag) sum[i] = a + b + c;
}
onezeropack();
double ans = (double)dp[QQ]/100;
printf("%.2lf\n",ans);
}
return 0;
}
</span>