zoukankan      html  css  js  c++  java
  • 第六周 N题

    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就好了(这里倒过来循环方便寻找)
     
     
     
    代码如下:
     
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 int N[105];
     4 double P[105],d[10005];
     5 double max(double a,double b)
     6 {
     7     return a>b?a:b;
     8 }
     9 int main()
    10 {
    11     int T,c=0;
    12     scanf("%d%",&T);
    13     while(T--)
    14     {
    15         c++;
    16         int n,total=0;
    17         double p;
    18         memset(d,0,sizeof(d));
    19         d[0]=1;
    20         scanf("%lf%d",&p,&n);
    21         for(int i=0; i<n; i++)
    22         {
    23             scanf("%d%lf",&N[i],&P[i]);
    24             total+=N[i];
    25         }
    26 
    27         for(int i=0;i<n;i++)
    28         {
    29             for(int j=total;j>=N[i];j--)
    30             {
    31                 d[j]=max(d[j],d[j-N[i]]*(1-P[i]));
    32                 //printf("%d  %lf
    ",j,d[j]);
    33             }
    34         }
    35         for(int i=total;i>=0;i--)
    36         {
    37            // printf("%lf  %d
    ",d[i],i);
    38             if(d[i]>=1-p)
    39             {
    40                 printf("Case %d: %d
    ",c,i);
    41                 break;
    42             }
    43         }
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    JSON--List集合转换成JSON对象
    某些项目因位于工作空间目录中而被隐藏
    Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
    SQLSERVER2008 18456错误
    android捕获ListView中每个item点击事件
    Android中Toast的用法简介
    android ListView详解
    Android调试工具及方法
    免费卫星图像下载网站
    ArcScene三维制作
  • 原文地址:https://www.cnblogs.com/huangguodong/p/4744231.html
Copyright © 2011-2022 走看看