HDU-2955 Robberies DP
题目就是概率的问题,意思是去抢A银行,被捉的概率是ai,抢B银行,被捉的概率是bi,因此不被捉的概率是(1-ai)*(1-bi)......因此整个题目我们用逃避概率来计算。
代码如下:
#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; struct Node { int m; double poss; }e[105]; double dp[10005]; int N, max; double poss; inline double Max(double x, double y) { return x > y ? x : y; } inline void zero_one(int x) { for (int i = max; i >= e[x].m; --i) { if (dp[i-e[x].m] != -1) { dp[i] = Max(dp[i], dp[i-e[x].m]*e[x].poss); } } } void DP() { for (int i = 0; i < N; ++i) { zero_one(i); } } int main() { int T; scanf("%d", &T); while (T--) { max = 0; dp[0] = 1; scanf("%lf %d", &poss, &N); poss = 1-poss; for (int i = 0; i < N; ++i) { scanf("%d %lf", &e[i].m, &e[i].poss); e[i].poss = 1-e[i].poss; max += e[i].m; } for (int i = 1; i <= max; ++i) { dp[i] = -1; } DP(); for (int i = max; i >= 0; --i) { if (dp[i] >= poss) { printf("%d\n", i); break; } } } return 0; }