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; }