hdu 2955 Robberies
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2955
思路:裸的01背包
已知被抓的概率,因为不是相互独立的,一次被抓就不用讨论了,所以我们讨论不被抓的最大概率。
#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> using namespace std; double dp[10010],P,p[110]; int money[110]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%lf%d",&P,&n); int sum=0; for(int i=1;i<=n;i++) { scanf("%d%lf",&money[i],&p[i]); sum+=money[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++) for(int j=sum;j>=money[i];j--) dp[j]=max(dp[j],(1-p[i])*dp[j-money[i]]); int mx=0; for(int i=sum;i>=0;i--) { if(dp[i]>=1-P) { mx=i; break; } } printf("%d\n",mx); } return 0; }