HDU - 2955 Robberies(01背包)
2015-09-18 08:54
363 查看
题目大意:给出N个银行里存放的钱和抢劫了该银行被捕的概率
要求你找出能抢劫的最多的钱,且被捕概率要小于等于Q
解题思路:01背包问题
用dp[i]表示抢劫了i的钱,没有被捕的最大概率
则转移方程为
dp[i] = max(dp[i], dp[i - val] * (1 - cost))
其中的1-cost表示的是不被捕捉到的概率
要求你找出能抢劫的最多的钱,且被捕概率要小于等于Q
解题思路:01背包问题
用dp[i]表示抢劫了i的钱,没有被捕的最大概率
则转移方程为
dp[i] = max(dp[i], dp[i - val] * (1 - cost))
其中的1-cost表示的是不被捕捉到的概率
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N = 10010; int n, Sum; double p; int val ; double c , dp ; void init() { scanf("%lf%d", &p, &n); Sum = 0; for (int i = 0; i < n; i++) { scanf("%d%lf", &val[i], &c[i]); Sum += val[i]; } } void solve() { memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 0; i < n; i++) for (int j = Sum; j >= val[i]; j--) dp[j] = max(dp[j], dp[j - val[i]] * (1 - c[i])); for (int i = Sum; i >= 0; i--) { if (dp[i] > 1 - p) { printf("%d\n", i); return ; } } } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }