小记:题目要看清,单项指的是单类,这里用的是dp。
代码:
#include <stdio.h> #include <string.h> #define max(a,b) (a)>(b)?(a):(b) int p[50]; double d[3000001]; int main() { double sum, total, pri, maxm, a, b, c; char str; int n,m,k,flag,i,v,j,t; while(scanf("%lf%d",&total,&n),n){ t= 0; for( i = 0; i < n; ++i){ scanf("%d",&m); sum = a = b = c = 0.0; flag = 0; for( j = 0; j < m; ++j){ scanf(" %c:%lf",&str,&pri); switch(str){ case 'A': a += pri;break; case 'B': b += pri; break; case 'C': c += pri; break; } if(str != 'A' && str != 'B' && str != 'C'){ flag = 1; } if(a > 600 || b > 600 || c > 600){ flag = 1; } sum += pri; if(sum > 1000){ flag = 1; } } if(!flag){ p[t++] = (int)(sum*100); } } memset(d,0,sizeof(d)); d[0] = 1; for( i = 0; i < t; ++i){ for( v = (int)(total*100) ; v >= p[i]; --v){ if(d[v - p[i]] == 1){ d[v] = 1; } } } for( i = (int)(total*100); i >= 0 ; --i){ if(d[i] == 1 ){ maxm = i; break; } } printf("%.2f\n",maxm/100.0); } return 0; }
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> using namespace std; #define mst(a,b) memset(a,b,sizeof(a)) #define REP(a,b,c) for(int a = b; a < c; ++a) #define eps 10e-8 const int MAX_ = 110; const int N = 3000010; const int INF = 0x7fffffff; int p[MAX_]; int dp[N]; int main(){ double total, m, sum, a, b, c; int k, n, cnt, tmp; char cc; while(scanf("%lf%d", &total, &k), k > 0){ cnt = 0; REP(i, 0, k){ scanf("%d", &n); bool flag; flag = 0; sum = 0; a = b = c = 0; REP(j, 0, n){ getchar(); scanf("%c:%lf",&cc, &m); switch(cc){ case 'A':a += m; break; case 'B':b += m; break; case 'C':c += m; break; default : flag = 1; } if(a > 600 || b > 600 || c > 600){ flag = 1; } sum += m; } if(flag || sum > 1000)continue; p[cnt++] = (int)(sum*100.0); } mst(dp, 0); tmp = (int)(total * 100); REP(i, 0, cnt){ for(int v = tmp; v >= p[i]; -- v){ dp[v] = max(dp[v], dp[v - p[i]] + p[i]); } } if(dp[tmp] > tmp)dp[tmp] = tmp; printf("%.2f\n", dp[tmp]/100.0); } return 0; }