題目:
Robberies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18298 Accepted Submission(s): 6769
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
描述:給定搶銀行被抓的概率和銀行數,再分別給出每個銀行能搶到的錢數以及被抓的概率,求不被抓的情況下能搶到的最大錢數。
題解:首先能肯定的是肯定不能用概率做下標去dp錢數,那麼第一可以考慮dp[i]表示搶i百萬元錢時不被抓的概率,最後從sum開始找到第一個小於總的不被抓的概率的錢數i輸出。
代碼:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
const int maxn = 105;
int v[maxn];
double dp[10005];
int main()
{
//freopen("input.txt", "r", stdin);
int T, N;
double P, w[maxn] = { 0.0 };
scanf("%d", &T);
while (T--)
{
scanf("%lf%d", &P, &N);
int sum = 0;
for (int i = 0; i < N; i++)
{
cin >> v[i] >> w[i];
sum += v[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 0; i < N; i++)
for (int j = sum; j >= v[i]; j--)
dp[j] = max(dp[j], dp[j - v[i]] * (1 - w[i]));
for (int i = sum; i >= 0; i--)
if (dp[i] > 1-P)
{
cout << i << endl;
break;
}
}
return 0;
}