HDU 2955 (01背包变形)
2017-05-08 21:30
405 查看
题意:
有n个银行,一个大盗想抢劫银行,在每一个银行都有被抓主的概率。现在就是给出一
概率P,表示他能够在<= P概率之下的风险去抢劫。每次抢劫成功都把银行的钱拿走
问最多拿多少。
思路:
dp[i]表示抢劫得到的钱i下,所不被抓的可能性最大。
难点:预处理,深度理解dp表示的含义。
dp[0]表示不抢劫所被抓住的概率为1,那么就按照0-1背包写出就行。
有n个银行,一个大盗想抢劫银行,在每一个银行都有被抓主的概率。现在就是给出一
概率P,表示他能够在<= P概率之下的风险去抢劫。每次抢劫成功都把银行的钱拿走
问最多拿多少。
思路:
dp[i]表示抢劫得到的钱i下,所不被抓的可能性最大。
难点:预处理,深度理解dp表示的含义。
dp[0]表示不抢劫所被抓住的概率为1,那么就按照0-1背包写出就行。
#include <iostream> #include <cstdio> #include <math.h> using namespace std; double dp[10005]; double max(double a,double b) { return a > b ? a:b; } int main() { //freopen("in.txt","r",stdin); double P,pn[102]; int n,mn[102]; int ncase; cin>>ncase; while(ncase--) { int sum = 0; cin>>P>>n; for(int i = 0;i < n; i++) { cin>>mn[i]>>pn[i]; sum += mn[i]; pn[i] = 1 - pn[i]; } for(int i = 0;i <= sum; i++) dp[i] = 0; dp[0] = 1; for(int i = 0;i < n; i++) { for(int j = sum;j >= mn[i]; j--) { dp[j] = max(dp[j],dp[j-mn[i]]*pn[i]); } } for(int i = sum;i >= 0; i--) { if(1-dp[i] <= P) { cout<<i<<endl; break; } } } return 0; }
相关文章推荐
- HDU 2955-Robberies(01背包变形)
- hdu 2955 Robberies(01背包变形)
- HDU 2955 Robberies(01背包变形)
- hdu 2955 01 背包小变形
- hdu 2955 Robberies 01背包变形
- HDU 2955 Robberies(01背包变形)
- HDU 2955 Robberies --01背包变形
- hdu 2955(01背包变形)
- HDU 2955 Robberies抢劫案(01背包,变形)
- HDU 2955 推荐 抢银行+01背包变形
- hdu 2955 Robberies(01背包变形)
- hdu 2660 Accepted Necklace(01-背包变形 || DFS)
- HDU 3602 2012【01 背包变形】
- hdu 2955(01 背包)
- HDU 2955 Robberies(DP:01背包)
- hdu–2369 Bone Collector II(01背包变形题)
- HDU 2546 饭卡(01背包小变形)
- hdu 4104 Discount 01背包变形+优化
- hdu 2955 (0-1背包变形)
- HDU 2955 Robberies(经典01背包概率问题)