hdu 2955 01揹包

按照01 揹包知道 概率應該作爲揹包 但是浮點型不能直接減, 所以轉換下
將錢的總和作爲揹包 被抓的概率轉換爲不被抓的概率 作爲價值;


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

double dp[10050], c[110];
int v[110];

int main()
{
    int t, sum;
    scanf("%d", &t);
    while(t--)
    {
        double q;
        int n;
        sum = 0;
        scanf("%lf%d", &q, &n);
        for(int i = 0; i < n; i++)
        {
            scanf("%d%lf", &v[i], &c[i]);
            sum += v[i];
        }
        memset(dp, 0, sizeof(dp));
        dp[0] = 1.0;
        for(int i = 0; i < n; i++)
            for(int j = sum; j >= v[i]; j--)
                dp[j] = max(dp[j], dp[j-v[i]]*(1-c[i]));//搶劫j元不被抓的最大概率,
        for(int j = sum; j >= 0; j--)
            if(dp[j] >= 1-q)//p是被抓的概率,1-p是不被抓的概率。
            {
                printf("%d\n", j);
                break;
            }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章