HDU 2955 —— Robberies 01背包

来源:互联网 发布:淘宝网女士纱巾 编辑:程序博客网 时间:2024/04/28 18:33

http://acm.hdu.edu.cn/showproblem.php?pid=2955


题意:给出概率p和n;下面n行表示每个银行的钱数和被抓的概率;要求被抓概率不得超过p;问最多可以偷多少钱;


注意点:1、从反面思考,不被抓的概率;2、将所有银行的钱数看作是总容量,概率为价值;3、如果一个银行都偷不了输出是0;


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxv = 10000+10;float dp[maxv];float p;int n;struct Node{int v;float p;}node[110];int main(){int cas;scanf("%d", &cas);while(cas--){scanf("%f%d", &p, &n);int sum = 0;for(int i = 1;i<=n;i++){scanf("%d%f", &node[i].v, &node[i].p);sum += node[i].v;}memset(dp, 0, sizeof dp);dp[0] = 1;for(int i = 1;i<=n;i++){for(int j = sum;j>=node[i].v;j--){dp[j] = max(dp[j], dp[j-node[i].v]*(1-node[i].p));}}int ans = 0;for(int i = 1;i<=sum;i++){if(1-dp[i] <= p){ans = max(ans, i);}}printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击