(概率 01背包) Just another Robbery -- LightOJ -- 1079

http://lightoj.com/volume_showproblem.php?problem=1079

Just another Robbery

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 probability P 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

Output for 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


Case 1: 2

Case 2: 4

Case 3: 6

Note

For the first case, if he wants to rob bank 1 and 2, then the probability of getting caught is 0.02 + (1 - 0.02) * .03 = 0.0494 which is greater than the given probability (0.04). That‘s why he has only option, just to rob rank 2.

第一次接触概率的01背包, 感觉挺神奇的, 虽然在比赛的时候没写出来, 补题也是在好几天后, 但能看懂, 还是很高兴, 提示自己以后要看点背包和 dp 的题了, 虽然比赛很烂, 但是我觉得这样挺好的,可以时常弥补自己的不足

#include<stdio.h>
#define N 110
#define min(a,b) (a)>(b)?(b):(a)

int v[N];
double dp[N][N*N], p[N];

/***

题意:给出银行的个数和被抓概率上限。在给出每个银行的钱和抢劫这个银行被抓的概率。
      求不超过被抓概率上线能抢劫到最多的钱。

      dp题,转移方程 dp[i][j] = min(dp[i-1][j] , dp[i-1][j-v[i]]) ,
      dp[i][j]表示前 i 个银行抢劫到 j 这么多钱被抓的概率。

      初始化时 dp[0][0] = 0 , 因为 dp[0][1~n]是不可能的情况,dp[0][1~n]=-1

***/

int main()
{
    int T, iCase=1;
    scanf("%d", &T);
    while(T--)
    {
        int i, j, n, sum=0;
        double P;

        scanf("%lf%d", &P, &n);

        for(i=1; i<=n; i++)
        {
            scanf("%d%lf", &v[i], &p[i]);
            sum += v[i];
        }

        for(i=1; i<=sum; i++)
            dp[0][i] = -1;

        dp[0][0] = 0;
        for(i=1; i<=n; i++)
        for(j=0; j<=sum; j++)
        {
            if(j<v[i] || dp[i-1][j-v[i]]<-0.5)
                dp[i][j] = dp[i-1][j];
            else if(dp[i-1][j]<0)
                dp[i][j] = dp[i-1][j-v[i]] + (1-dp[i-1][j-v[i]])*p[i];
            else
                dp[i][j] = min(dp[i-1][j], dp[i-1][j-v[i]]+(1-dp[i-1][j-v[i]])*p[i]);
        }

        int ans = 0;
        for(i=0; i<=sum; i++)
            if(dp[n][i]>-0.5 && dp[n][i]<P)
            ans = i;

        printf("Case %d: %d\n", iCase++, ans);
    }
    return 0;
}
时间: 2024-11-07 07:15:13

(概率 01背包) Just another Robbery -- LightOJ -- 1079的相关文章

hdu 1203 概率+01背包

I NEED A OFFER! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1203 Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的.Speakless没有多少钱,总共只攒了n万美元

LightOJ 1079 Just another Robbery (01背包)

题意:给定一个人抢劫每个银行的被抓的概率和该银行的钱数,问你在他在不被抓的情况下,能抢劫的最多数量. 析:01背包,用钱数作背包容量,dp[j] = max(dp[j], dp[j-a[i] * (1.0 - pp[i])),dp[i] 表示不被抓的最大概率,在能抢劫到 i 个钱. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <stri

LightOJ1079---Just another Robbery (概率做01背包)

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

hdu2955---Robberies(概率做01背包)

Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they become too greedy. He has decided to work in the lucrative business of bank robbery only

01背包,概率

原题http://acm.hdu.edu.cn/showproblem.php?pid=2955 Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11820    Accepted Submission(s): 4398 Problem Description The aspiring Roy the Robber

hdoj 1203 I NEED A OFFER! 【另类01背包】【概率背包】

题意:... 策略:动态规划. 因为是求至少能得到一个offer的概率,那我们可以反着求,求得不到一个offer的概率,最后用1减去就好了. 代码: #include<string.h> #include<stdio.h> double dp[10010]; struct node{ int a; double b; }s[10010]; int main() { int n, m, i, j; while(scanf("%d%d", &n, &

lightoj 1079 Just another Robbery 解题心得

原题: 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 - H

hdu 2955 Robberies 0-1背包/概率初始化

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

LightOJ - 1079 概率dp

题意:n个银行,每个有价值和被抓概率,要求找被抓概率不超过p的最大价值 题解:dp[i][j]表示前i个取j价值的所需最小概率,01背包处理,转移方程dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+(1-dp[i-1][j-v[i]])*p) #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi