HDU2955(Robberies)

http://acm.hdu.edu.cn/showproblem.php?pid=2955

这一题重点是确定dp的下标的意义..由于概率是浮点数,精度有限,所以应该把钱数作为背包容量.

想懂了就很简单了,贴出代码.

 1 #include <iostream>  
 2 using namespace std;
 3 #define maxn 21000
 4 
 5 typedef double real;
 6 real P[maxn];
 7 int M[maxn];
 8 real max_p;
 9 real dp[maxn];
10 
11 int main()
12 {
13     int T, N, sum;
14     cin >> T;
15     while (T--) {
16         cin >> max_p >> N;
17         sum = 0;
18         for (int i = 0; i < N; ++i) {
19             cin >> M[i] >> P[i];
20             sum += M[i];
21         }
22         fill(dp, dp + sum + 1, 0);
23         dp[0] = 1;
24         for (int i = 0; i < N; ++i)
25             for (int j = sum; j >= M[i]; --j)
26                 dp[j] = max(dp[j], dp[j - M[i]] * (1.0 - P[i]));
27 
28         max_p = 1.0 - max_p;
29         while (dp[sum] <= max_p) --sum;
30         cout << sum << endl;
31     }
32     return 0;
33 }

 

posted @ 2018-03-19 21:49  向往天空的羽毛  阅读(132)  评论(0编辑  收藏  举报