这道题比较难的就是对读入和特殊条件的判断,做完之后就是个背包..
注意细节
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#define MAX 30007
using namespace std;
double sum;
int n,m;
int dp[3000050];
int main ( )
{
while ( ~scanf ( "%lf" , &sum ) )
{
vector<int> v;
char str[500];
int total = sum*100;
scanf ( "%d" , &n );
if ( !n ) break;
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%d" , &m );
double temp = 0.0 , temp1 = 0.0 , temp2 = 0.0 , temp3 = 0.0;
bool flag = true;
for ( int j = 1 ; j <= m ; j++)
{
scanf ( "%s" , str );
double num = 0.0;
int len = strlen ( str );
if ( str[0] > 'C' || str[0] <'A' )
{
flag = false;
continue;
}
int k = 2;
while ( k < len )
{
if ( str[k] == '.' ) break;
else num = num*10+str[k]-48;
k++;
}
k++;
double pos = 0.1;
while ( k < len )
{
num += ( str[k] -48 )*pos;
pos *= 0.1;
k++;
}
//if ( num > 600.00 ) flag = false;
if ( str[0] == 'A' ) temp1 += num;
if ( str[0] == 'B' ) temp2 += num;
if ( str[0] == 'C' ) temp3 += num;
if ( temp1 > 600.00 || temp2 > 600.00 || temp3 > 600.00 )
flag = false;
temp += num;
}
if ( temp > 1000.00 ) flag = false;
if ( flag ) v.push_back ( temp*100 );
}
int len = v.size();
//int dp[total+2];
memset ( dp , 0 , sizeof ( dp ) );
dp[0] = 1;
for ( int i = 0 ; i < len ; i++ )
for ( int j = total ; j >= v[i] ; j-- )
if ( dp[j-v[i]] )
dp[j] = 1;
for ( int i = total ; i >= 0 ; i-- )
if ( dp[i] )
{
printf ( "%.2lf\n" , i*1.0/100.0 );
break;
}
}
}