hdu 2955 Robberies 01背包

//以抢的钱为背包容量 求最大容量且概率又小于被抓概率的
#include <iostream>
using namespace
std;

struct
Bag
{

    double
pro;
    int
money;
};


Bag b[101];
double
dp[10001];

inline
double max(double a, double b)
{

    return
a>b?a:b;
}


int
main()
{

    int
T;
    scanf("%d", &T);

    while
(T--)
    {

        double
MAX;
        int
n, i, j, cnt = 0;
        scanf("%lf %d", &MAX, &n);
        int
sum = 0;
        for
(i = 0 ; i < n; ++i)
        {

            double
pro;
            int
money;
            scanf("%d %lf", &money, &pro);
            if
(pro <= MAX)
            {

                b[cnt].money = money;
                b[cnt++].pro = 1 - pro;
                sum += money;
            }
        }


        for
(i = 0; i <= sum; ++i)
        {

            dp[i] = 1;
        }


        MAX = 1 - MAX;
       
        dp[b[0].money] = b[0].pro;
        for
(i = 1; i < cnt; ++i)
        {

            for
(j = sum; j >= b[i].money; --j)
            {

                int
k = j-b[i].money;
                if
(dp[k] != 1 || k == 0)
                {

                    if
(dp[j] == 1)
                    {

                        dp[j] = dp[k]*b[i].pro;
                    }

                    else

                    {

                        dp[j] = max(dp[j], dp[k]*b[i].pro);
                    }
                }
            }
        }

        dp[0] = MAX + 2;
        for
(i = sum; i >= 0; --i)
        {

            if
(dp[i] != 1 && dp[i] > MAX)
            {

                printf("%d\n", i);
                break
;
            }
        }
       
    }

    return
0;
}

posted on 2009-07-30 20:16  ZAFU_VA  阅读(315)  评论(0编辑  收藏  举报

导航