您的位置:首页 > 其它

第六周 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就好了(这里倒过来循环方便寻找)

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: