LightOJ 1079 - Just another Robbery 【背包问题】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1079

题意:
给你一些银行的存储金钱的数目及被抓的概率,若被抓总概率不超过p的话,问不被抓的条件下最多可以抢多少钱?

思路:
对于一个银行,可以抢或者不抢,于是想到了背包。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <string>

using namespace std;

double p;
int n;

int a[110];
double b[110];
double dp[11000];


int main()
{
    int T;
    scanf("%d", &T);
    for (int t = 1;t <= T;t++)
    {
        memset(dp, 0, sizeof(dp));

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

        int sum = 0;
        for (int i = 1;i <= n;i++)
        {
            scanf("%d%lf", &a[i], &b[i]);
            sum += a[i];
        }

        dp[0] = 1;

        for (int i = 1;i <= n;i++)
        {
            for (int j = sum;j >= a[i];j--)
            {
                dp[j] = max(dp[j], dp[j - a[i]] * (1 - b[i]));              
            }
        }

        int ans = 0;
        for (int i = 0;i <= sum;i++)
        {
            if (1 - dp[i] < p)
            ans = max(i, ans);
        }

        printf("Case %d: %d\n", t, ans);
    }
    return 0;
}

你可能感兴趣的:(LightOJ 1079 - Just another Robbery 【背包问题】)