hdu2955 Robberies(背包)

https://vjudge.net/problem/HDU-2955

概率是浮点数,只能做值(而且这里是累乘,也不能化成整数),这里注意要化成安全概率(1-p[i]),求安全概率的最大值。

钱数作二层循环,最后用max取满足概率条件的最大值(再化回被抓概率)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<cmath> 
 7 #define lson l, m, rt<<1
 8 #define rson m+1, r, rt<<1|1
 9 #define IO ios::sync_with_stdio(false);cin.tie(0);
10 #define INF 1e9
11 typedef long long ll;
12 using namespace std;
13 int t, n, m[100010];
14 double P, p[100010], dp[100010];
15 int main()
16 {
17     IO;
18     cin >> t;
19     while(t--){
20         cin >> P >> n;
21         int sum = 0;
22         memset(dp, 0, sizeof(dp)); 
23         for(int i = 0; i < n; i++){
24             cin >> m[i] >> p[i];
25             sum += m[i];
26         }
27         dp[0] = 1;//只要dp[0]=1即可,不是全置1 
28         for(int i = 0; i < n; i++){
29             for(int j = sum; j >= m[i]; j--){
30                 dp[j] = max(dp[j], dp[j-m[i]]*(1-p[i]));
31             }
32         }
33         int maxm=-INF;
34         for(int i = 0; i <= sum; i++){
35             if(1-dp[i] <= P){
36                 maxm = max(i, maxm);//用max界定最大值最方便 
37             }  
38         } 
39         cout << maxm << endl;
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/Surprisezang/p/8886595.html