第六周 N题
2015-08-20 10:03
302 查看
Description
As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (he wants everything quick!) so he decided to rob banks. He wants to make a calculated risk, and grab as much money as possible. But his friends - Hermione and Ron have decided upon a tolerable probabilityP of getting caught. They feel that he is safe enough if the banks he robs together give a probability less than P.
Input
Input starts with an integer T (≤ 100), denoting the number of test cases.
Each case contains a real number P, the probability Harry needs to be below, and an integer N (0 < N ≤ 100), the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj (0 < Mj ≤ 100) and a real number Pj . Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj. A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
Output
For each case, print the case number and the maximum number of millions he can expect to get while the probability of getting caught is less than P.
Sample Input
3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05
Sample Output
Case 1: 2
Case 2: 4
Case 3: 6
题意:一个人去抢银行,输入它被抓的概率(P)和银行的个数(N),接下来输入每个银行的钱和被抓的概率....
求这个人可以不被抓最多可以抢钱抢到多少....
解题思路:
既然是求他不被抓又抢到的钱最多,那么就是求他不被抓的概率中抢到的钱最多的...
那d[j]表示他不被抓的概率,j表示抢到的钱
d[j]=max(d[j],d[j-N[i]]*(1-P[i]))
这里的N[i]表示银行里的钱,P[i]表示被抓概率.
求出他抢到的钱不被抓的概率后,只要循环找到满足dp[j]>=1-p的j就好了(这里倒过来循环方便寻找)
代码如下:
As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (he wants everything quick!) so he decided to rob banks. He wants to make a calculated risk, and grab as much money as possible. But his friends - Hermione and Ron have decided upon a tolerable probabilityP of getting caught. They feel that he is safe enough if the banks he robs together give a probability less than P.
Input
Input starts with an integer T (≤ 100), denoting the number of test cases.
Each case contains a real number P, the probability Harry needs to be below, and an integer N (0 < N ≤ 100), the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj (0 < Mj ≤ 100) and a real number Pj . Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj. A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
Output
For each case, print the case number and the maximum number of millions he can expect to get while the probability of getting caught is less than P.
Sample Input
3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05
Sample Output
Case 1: 2
Case 2: 4
Case 3: 6
题意:一个人去抢银行,输入它被抓的概率(P)和银行的个数(N),接下来输入每个银行的钱和被抓的概率....
求这个人可以不被抓最多可以抢钱抢到多少....
解题思路:
既然是求他不被抓又抢到的钱最多,那么就是求他不被抓的概率中抢到的钱最多的...
那d[j]表示他不被抓的概率,j表示抢到的钱
d[j]=max(d[j],d[j-N[i]]*(1-P[i]))
这里的N[i]表示银行里的钱,P[i]表示被抓概率.
求出他抢到的钱不被抓的概率后,只要循环找到满足dp[j]>=1-p的j就好了(这里倒过来循环方便寻找)
代码如下:
#include <stdio.h> #include <string.h> int N[105]; double P[105],d[10005]; double max(double a,double b) { return a>b?a:b; } int main() { int T,c=0; scanf("%d%",&T); while(T--) { c++; int n,total=0; double p; memset(d,0,sizeof(d)); d[0]=1; scanf("%lf%d",&p,&n); for(int i=0; i<n; i++) { scanf("%d%lf",&N[i],&P[i]); total+=N[i]; } for(int i=0;i<n;i++) { for(int j=total;j>=N[i];j--) { d[j]=max(d[j],d[j-N[i]]*(1-P[i])); //printf("%d %lf\n",j,d[j]); } } for(int i=total;i>=0;i--) { // printf("%lf %d\n",d[i],i); if(d[i]>=1-p) { printf("Case %d: %d\n",c,i); break; } } } return 0; }
相关文章推荐
- hadoop对于压缩文件的支持及算法优缺点
- oracle表空间用户添加、删除操作
- [leetcode] Length of Last Word C语言
- When you are old (当你老了)
- spring mvc 异常处理(转)
- 播放Android项目工程里的视频文件
- 两种将ppt文件转换成pdf格式的方法
- 删除文件或文件夹的批处理
- HDU 2112 HDU Today <SPFA算法+map函数>
- poj -1416-Shredding Company-DFS
- Objective C实现多继承!
- !important css样式
- MFC工程去掉#include <windows.h>
- 查看系统资源
- 做最好的自己
- 使用java8轻松处理日期
- POJ 2425 A Chess Game(SG函数的有向图博弈游戏)
- Activity注意事项总结
- 标量子查询
- KMP及相关算法