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 }