简单dp
http://acm.hdu.edu.cn/showproblem.php?pid=1864
#include<iostream>
#include<string>
using namespace std;
double dp[50];
double max(double a,double b)
{
return a>b?a:b;
}
int main()
{
int m,n,j,i;
double val,A,B,C;
char c;
double v;
double sum[30];
int flag;
while(cin>>val>>n&&n)
{
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
A=B=C=0;
cin>>m;
flag=1;
for(j=0;j<m;j++)
{
getchar();
scanf("%c:%lf",&c,&v);
if(c=='A') A+=v;
else if(c=='B') B+=v;
else if(c=='C') C+=v;
else flag=0;
sum[i]+=v;
}
if(sum[i]>1000||flag==0||A>600||B>600||C>600)
sum[i]=0;
// cout<<sum[i]<<' ';
}
for(i=1;i<=n;i++)
{
for(j=n;j>=0;j--){
if(dp[j-1]+sum[i-1]<=val)
dp[j]=max(dp[j],dp[j-1]+sum[i-1]);
// cout<<dp[j]<<' ';
}
}
double max=dp[0];
for(i=n;i>=0;i--)
if(dp[i]>max){
max=dp[i];
}
printf("%.2f\n",max);
}
return 0;
}
浙公网安备 33010602011771号