问题描述
有抱负的强盗罗伊看过很多美国电影,知道坏人最后通常会被抓住,往往是因为他们变得太贪婪 了。他决定只在银行抢劫这一利润丰厚的行业工作很短一段时间,然后退休后在一所大学找到一份舒适的工作。
几个月来,罗伊一直在评估各家银行的安全性及其持有的现金数量。他想计算风险,并尽可能多地攫取钱。
他的母亲奥拉(Ola)已经决定了一个可以容忍的被抓的可能性。她觉得,如果他一起抢劫的银行给出的概率小于这个概率,他就足够安全了。
几个月来,罗伊一直在评估各家银行的安全性及其持有的现金数量。他想计算风险,并尽可能多地攫取钱。
他的母亲奥拉(Ola)已经决定了一个可以容忍的被抓的可能性。她觉得,如果他一起抢劫的银行给出的概率小于这个概率,他就足够安全了。
输入
输入的第一行给出 T,即案例数。对于每个场景,第一行输入给出一个浮点数 P,即 Roy 需要低于的概率,以及一个整数 N,即他计划的银行数量。然后遵循 N 行,其中行 j 给出一个整数 Mj 和一个浮点数 Pj 。
银行j包含Mj数百万,抢劫被抓的概率为Pj。
输出
对于每个测试用例,输出一行,其中包含他可以预期获得的最大百万数,而被捕获的概率小于设置的限制。
注意事项和约束
0 < T <= 100 0.0 <= P <= 1.0 0 < N <= 100 0 < Mj <= 100 0.0 <= Pj <=
1.0 如果
银行被抢劫,银行就会破产,您可能会假设所有概率都是独立的,因为警察的资金非常少。
示例输入
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
示例输出
2
4
6
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();//案例数
while (T-- != 0) {
double ps = 1-sc.nextDouble();//不被抓总概率
int n = sc.nextInt();//计划抢劫银行数量
int[] money = new int[n + 1];//银行储备资金--物品体积
double[] p = new double[n + 1];//抢劫银行不被抓概率--物品价值
int moneys=0;//所有银行总资金
for (int i = 1; i <= n; i++) {
money[i] = sc.nextInt();
moneys+=money[i];
p[i] =1-sc.nextDouble() ;
}
double[] dp = new double[moneys+1];
dp[0]=1;
//每家银行只能抢劫一次---01背包(外层物品,内层背包)
for (int i = 1; i <= n ; i++) {
for (int j = moneys; j >= money[i]; j--) {
dp[j] = Math.max(dp[j],dp[j-money[i]]*p[i]);
}
}
for (int i = moneys; i >=0 ; i--) {
if(dp[i]>=ps) {
System.out.println(i);
break;
}
}
}
}
}