hdu2955_Robberies 01背包
有一个强盗要去几个银行偷盗,他既想多投点钱,又想尽量不被抓到。已知各个银行
的金钱数和被抓的概率,以及强盗能容忍的最大被抓概率。求他最多能偷到多少钱?
解:以概率为价值 问价值在合理范围背包的最大容量
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct bag { int v; double p; }Bag[10010]; double dp[10010]; int main() { int T,N; double p; scanf("%d",&T); while(T--) { scanf("%lf %d",&p,&N); int sum = 0; for(int i = 0; i < N; i++) { scanf("%d%lf",&Bag[i].v,&Bag[i].p); sum += Bag[i].v; } memset(dp,0,sizeof(dp)); dp[0] = 1; for(int i = 0; i < N; i++) { for(int j = sum; j >= Bag[i].v; j--) { dp[j] = max(dp[j],dp[j-Bag[i].v]*(1-Bag[i].p)); } } for(int i = sum; i >= 0; i--) { if(dp[i] > 1-p) { printf("%d\n",i); break; } } } return 0; }