题目链接: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;
}