01背包+概率
题意:在不大于给定概率的情况下,算出最多可以拿到多少宝藏
思路:考虑到背包的容量不是整数,传统的背包就不能做了,这时候就看那个量还能作为背包的容量,
可以用总的宝藏数量当背包容量,在保证取得的宝藏尽量多的时候,概率还不能大于题目给定的概率,
算被抓的情况比较多,可以算反面不被抓的概率为:(1-a)*(1-b)
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<queue> #include<stack> #include<vector> #include<algorithm> using namespace std; typedef long long LL; #define N 100100 #define INF 0x3f3f3f3f int p[N]; double w[N], dp[N]; int main() { int T, n, sum; double v; scanf("%d", &T); while(T--) { scanf("%lf%d", &v, &n); memset(dp, 0, sizeof(dp)); dp[0]=1; sum=0; for(int i=1; i<=n; i++) { scanf("%d%lf", &p[i], &w[i]); sum+=p[i]; } for(int i=1; i<=n; i++) { for(int j=sum; j>=p[i]; j--) dp[j]=max(dp[j], dp[j-p[i]]*(1-w[i])); } for(int i=sum; i>=0; i--) { if(dp[i]>=(1-v)) { printf("%d ", i); break; } } } return 0; }