hdu 1864 背包问题

这道题比较难的就是对读入和特殊条件的判断,做完之后就是个背包..

注意细节

#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;
            }
    }
}


你可能感兴趣的:(C++,动态规划,背包)