hdu2955 Robberies 01背包 dp
2013-04-01 19:15
423 查看
链接:点我
题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。
分析:我第一眼看的时候觉得见到01,然后弄一个dp[100],把概率*100。。。。。。如果你和我一样这么想。。那么恭喜你上当了!需要把money当做下标。。。保存的是概率。。。状态转移方程:dp[j] = max(dp[j], (1.0-gai[i]) * dp[j-money[i]]);
题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。
分析:我第一眼看的时候觉得见到01,然后弄一个dp[100],把概率*100。。。。。。如果你和我一样这么想。。那么恭喜你上当了!需要把money当做下标。。。保存的是概率。。。状态转移方程:dp[j] = max(dp[j], (1.0-gai[i]) * dp[j-money[i]]);
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) const int maxn = 105; double dp[10005]; int main() { int t; scanf("%d", &t); while (t--) { double p, gai[maxn]; int n, money[maxn]; scanf("%lf %d", &p, &n); int i, j; int sum = 0; for (i=0; i<n; i++) { scanf("%d %lf", &money[i], &gai[i]); sum += money[i]; } memset(dp, 0, (sum+1)*sizeof(dp[0])); dp[0] = 1; if (p <= 1-1e-8) { for (i=0; i<n; i++) for (j=sum; j>=money[i]; j--) { double tmp = (1.0-gai[i]) * dp[j-money[i]]; dp[j] = max(dp[j], tmp); } for (i=sum; 1 - dp[i] >= p; i--); printf("%d\n", i); } else { printf("%d\n", sum); } } return 0; }
相关文章推荐
- Robberies---hdu2955(概率dp,01背包)
- hdu2955 Robberies (01背包)
- hdu2955 Robberies(01背包)
- HDU 2955 Robberies (01背包dp)
- hdu2955 Robberies(01背包)题解
- [HDU2955]Robberies[dp]
- HDOJ-2955 Robberies[01背包问题-DP]
- hdu2955 — Robberies (01背包)
- hdu2955 Robberies 01背包
- HDU2955 Robberies(01背包)
- HDU2955:Robberies(01背包)
- hdu2955 robberies题解(01背包)
- hdu2955 Robberies (01背包)
- 【DP(背包)】 hdu2955 Robberies
- HDU2955_Robberies【01背包】
- 【hdu2955】Robberies——01背包
- hdu2955 01背包 Robberies
- HDU2955 Robberies[01背包]
- hdu2955 Robberies(01背包)
- HDU2955_Robberies_01背包变种