HDU 2955 01背包

题意:一个人去抢银行,给你一个允许的最高被抓概率p,给你n个银行,然后给出n个银行的钱和抢劫该银行的被抓概率,求能获得的最大钱数

思路:开始一直在纠结那个被抓概率的小数问题,发现没办法直接去dp,得转化,可弱鸡我不会阿,看看题解,发现得方向转化一下,对不被抓概率dp

   关键一个点我没想到抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之积,题目给出的是被抓概率,被题目误导了

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Bank
 7 {
 8     int money;
 9     double risk;
10 }bank[10005];
11 int main()
12 {
13     int t;scanf("%d",&t);
14     while(t--){
15         int n;double p;
16         scanf("%lf%d",&p,&n);
17         p=1-p;        //题目给的是允许被抓的最高概率,现在算的是允许的最低不被抓概率
18         int sum=0;
19         for(int i=0;i<n;++i){
20             scanf("%d%lf",&bank[i].money,&bank[i].risk);
21             bank[i].risk=1-bank[i].risk;//算出抢劫每一个银行不被抓的概率、
22             sum+=bank[i].money;
23         }
24         double dp[10005]={1.0};    //一分钱也不抢的话不被抓的概率就是百分之百了
25                                 // dp数组里面存的是dp[i]抢i亿钱最高的不被抓概率
26                                 // 你想要不被抓,那么不被抓的概率一定要越高越好
27         for(int i=0;i<n;++i)
28             for(int j=sum;j>=bank[i].money;--j)
29                 dp[j]=max(dp[j],dp[j-bank[i].money]*bank[i].risk);    //而抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之积
30         for(int i=sum;i>=0;--i)    //想想:抢钱越多的话不被抓概率一定越低
31             if(dp[i]-p>1e-9){    //找寻第一个不被抓概率大于等于p的
32                 printf("%d\n",i);
33                 break;
34             }
35     }
36     return 0;
37 }
时间: 2024-10-15 23:53:32

HDU 2955 01背包的相关文章

Robberies hdu 2955 01背包

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10933    Accepted Submission(s): 4049 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that

poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

题目链接: poj3211  hdu1171 这个题目比1711难处理的是字符串如何处理,所以我们要想办法,自然而然就要想到用结构体存储,所以最后将所有的衣服分组,然后将每组时间减半,看最多能装多少,最后求最大值,那么就很愉快的转化成了一个01背包问题了.... hdu1711是说两个得到的价值要尽可能的相等,所以还是把所有的价值分为两半,最后01背包,那么这个问题就得到了解决.. 题目: Washing Clothes Time Limit: 1000MS   Memory Limit: 13

hdu 1203 01背包 I need a offer

hdu 1203  01背包  I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offer的概率以及花费,给定money,求得到至少一份offer的最大概率. 简单的01背包 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 double

HDU 2955 Robberies 背包概率DP

A - Robberies Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2955 Appoint description: Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usu

HDU 2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 35815    Accepted Submission(s): 14753 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

hdu 1864 01背包 最大报销额

http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18562    Accepted Submission(s): 5459

HDU 2639 01背包(分解)

http://acm.hdu.edu.cn/showproblem.php?pid=2639 01背包第k优解,把每次的max分步列出来即可 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct Node 6 { 7 int price; 8 int val; 9 }node[1005]; 10 int main() 11 { 12 i

HDU 2126 01背包(求方案数)

Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1886    Accepted Submission(s): 699 Problem Description When the winter holiday comes, a lot of people will have a trip. Genera

HDU 2639 01背包求第k大

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3718    Accepted Submission(s): 1903 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took par