hdu 1864 DP

来源:互联网 发布:手绘照片软件叫什么 编辑:程序博客网 时间:2024/05/23 23:36

这题真是把我恶心到了,不过有个地方要注意的是,不能在flag为1后就跳出该次循环,因为还要把剩余的给输入,蛋疼啊!!!!

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;int dp[5000000];int DP( int num[], int N, int sum ){memset( dp, 0, sizeof( dp ) );for( int i = 0; i < N; i++ ){for( int j = sum; j >= num[i]; j-- ){dp[j] = max( dp[j], dp[j-num[i]] + num[i] ); }}return dp[sum];}int main(){int num[31];double sum;int N;int count;while( scanf( "%lf%d", &sum, &N ) ){if( N == 0 ){break;}int m;int ta, tb, tc;int flag = 0;char c;count = 0;for( int i = 0; i < N; i++ ){scanf( "%d",&m );ta = tb = tc = 0;flag = 0;while( m-- ){double temp;scanf( "%*c%c:%lf", &c, &temp );temp *= 100;int x = (int)temp;if( flag == 0 ){//不能在falg==1后就立马结束该次循环,因为还要把之后的数据给输入!!!!!!if( c == 'A' || c == 'B' || c == 'C' ){if( c == 'A' ){ta += x;if( ta > 60000 ){flag = 1;}}else if( c == 'B' ){tb += x;if( tb > 60000 ){flag = 1;}}else{tc += x;if( tc > 60000 ){flag = 1;}}}else{flag = 1;}}} if( !flag && ta + tb + tc <= 100000 ){num[count++] = ta + tb + tc;}}int ans = DP( num, count, (int)( sum * 100 ) );printf( "%.2lf\n", ( (double)ans ) / 100.0 );}return 0;}


 

原创粉丝点击