题目是中文,就不解释了 。
最近准备系统的刷DP了,从背包开始。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
const int maxn = 1010;
int i,j,n,num,flag,cnt;
double dp[maxn],m[maxn];
char str,b;
double q,st;
double A,B,C,Maxx;
int main()
{
while(cin>>q>>n && n)
{
clr(dp,0);clr(m,0);
cnt = 1;
for(i=0; i<n; i++)
{
flag = 0;
A = 0;B = 0;C = 0;
cin>>num;
for(j=0; j<num; j++)
{
cin>>str>>b>>st;
if(str == 'A')
A += st;
else if(str == 'B')
B += st;
else if(str == 'C')
C += st;
else
flag = 1;
}
if(!flag && A<=600 && B<=600 && C<=600 && A+B+C<=1000)
m[cnt++] = A+B+C;
}
for(i=1; i<cnt; i++)
for(j=i-1; j>=0; j--)
if(dp[j] + m[i] <= q)
dp[i] = max(dp[i],dp[j]+m[i]);
Maxx = dp[0];
for(i=1; i<cnt; i++)
{
Maxx=max(Maxx,dp[i]);
}
printf("%.2lf\n",Maxx);
}
}