题意:你去抢银行,给你n个银行,每个银行有被抓的概率和能抢到的钱,给你一个最大的概率,当你被抓的总概率小于这个概率时可以认为你是安全的。。问你在安全的情况下能抢的最多的钱是多少。
题解:刚开始想成最简单的背包问题,因为体积(概率)是浮点数,所以疯狂将概率*100,*1000.等等来直接计算,发现不行。题目的思路是dp[i] = x; i 为抢到的钱,x为不被抓的最大概率。(我因为没有仔细理解题目,以为抢了2个银行是将2个银行的概率加起来就是你被抓的概率,而且这种思路还能过样例所以疯狂wa。)
dp公式为dp[j + w[i]] = max(dp[j + w[i]], dp[j] * (1 - s[i]));答案为 if(1 - dp[j + w[i]] <= v) maxx = max(maxx, j + w[i]);
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 5;
double s[maxn];
int w[maxn];
double dp[20005];
int main()
{
// freopen("in.txt", "r", stdin);
int T;
cin >> T;
while(T--)
{
int n;
double v;
cin >> v >> n;
int sum = 0;
for(int i = 1; i <= n; i++)
{
cin >> w[i] >> s[i];
sum += w[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int maxx = 0;
for(int i = 1; i <= n; i++)
for(int j = sum - w[i]; j >= 0; j--)
{
if(j == 0 || dp[j])
{
dp[j + w[i]] = max(dp[j + w[i]], dp[j] * (1 - s[i]));
if(1 - dp[j + w[i]] <= v) maxx = max(maxx, j + w[i]);
}
}
printf("%d\n", maxx);
}
return 0;
}