hdu 2955 Robberies(01背包)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

 

#define MAXN 105
#define MAXM 10005

int    sum, value[MAXN];
double p, weight[MAXN], f[MAXM];

inline double getMax(double a,double b)
{
    return a > b ? a : b;
}

void ZeroOnePack(int w, double v)
{
    for(int j = sum; j >= w; j--)
    {
        f[j] = getMax(f[j], f[j - w] * v);
        int nonon = 23;
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("indata.txt", "r", stdin);
#endif
    int T;
    scanf("%d", &T);

    while(T--)
    {
        int i = 1, num;
        double tp;
        scanf("%lf %d", &p, &num);
        sum = 0;
        while(num > 0)
        {
            scanf("%d %lf", &value[i], &tp);
            if(tp <= p)
            {
                weight[i] = 1.0 - tp;
                sum += value[i];
                i++;
            }
            num--;
        }
        num = i - 1;
    /*    printf("sum=%d\n", sum);
        for(i = 1; i <= num; i++)
        { printf("%f %d\n", weight[i], value[i]); }*/

        memset(f, 0, sizeof(f));
//        for(i = 0; i <= sum; i++) f[i] = 0.0;
        f[0] = 1.0;
        for(i = 1; i <= num; i++)
        {
            ZeroOnePack(value[i], weight[i]);
        }

    /*    for(i = sum; i >= 0; i--)
        {
            printf("%f ", 1.0 - f[i]);
        } printf("\n");*/
        for(i = sum; i >= 0; i--)
        {
            if(f[i] >= 1.0 - p)
            {
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}

posted @ 2010-10-18 08:23  菜到不得鸟  阅读(88)  评论(0)    收藏  举报