杭电oj--抢劫2955(01背包)

文章讨论了一位强盗罗伊如何在考虑被抓风险下,通过使用背包算法优化他在给定概率限制下抢劫多家银行的策略,以获取最大资金量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
       有抱负的强盗罗伊看过很多美国电影,知道坏人最后通常会被抓住,往往是因为他们变得太贪婪 了。他决定只在银行抢劫这一利润丰厚的行业工作很短一段时间,然后退休后在一所大学找到一份舒适的工作。
        几个月来,罗伊一直在评估各家银行的安全性及其持有的现金数量。他想计算风险,并尽可能多地攫取钱。
       他的母亲奥拉(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;
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.无聊人.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值