hdu 2955 01背包
来源:互联网 发布:淘宝一件代发下单流程 编辑:程序博客网 时间:2024/05/14 20:30
按照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;}