hdu 1864 最大报销额(dp)

小记:题目要看清,单项指的是单类,这里用的是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;
}


你可能感兴趣的:(hdu 1864 最大报销额(dp))