HDU——2955Robberies

如果是整数的话,可以直接01背包,但是是概率,所以有小数,但是依然可以转换为01背包。记录总的价值,dp[i]作为取到i的最大不被抓概率。那么满足条件的最大i就是答案。一直在想怎么搞满足概率,其实完全不用考虑,直接所有的情况都找出来,最后再比较就行了。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 using namespace std;
13 const double Pi=3.14159265358979323846;
14 typedef long long ll;
15 const int MAXN=100000+5;
16 const int dx[5]={0,0,0,1,-1};
17 const int dy[5]={1,-1,0,0,0};
18 const int INF = 0x3f3f3f3f;
19 const int NINF = 0xc0c0c0c0;
20 const ll mod=1e9+7;
21 int m[MAXN];
22 double P[MAXN]; 
23 double dp[MAXN];
24 int main()
25 {
26     int t;cin>>t;
27     while(t--)
28     {
29         double p;int n;
30         cin>>p>>n;int  sum=0;
31         for(int i=1;i<=n;i++)
32         {
33             cin>>m[i]>>P[i];
34             sum+=m[i];
35 
36         }
37         memset(dp,0,sizeof(dp));
38         dp[0]=1;
39         for(int i=1;i<=n;i++)
40             for(int j=sum;j>=m[i];j--)
41                 dp[j]=max(dp[j-m[i]]*(1-P[i]),dp[j]);
42         int ans;
43         for(int i=sum;i>=0;i--)
44         {
45             if(dp[i]>=(1-p)) 
46             {
47                 ans=i;break;
48             }
49         }
50         cout <<ans<<endl;
51     }
52     return 0;
53  } 

 

posted @ 2019-05-23 23:20  Chuhanjing  阅读(118)  评论(0编辑  收藏  举报