按照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;
}
hdu 2955 01揹包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.