
目录
- 专栏导读
 - 一、题目描述
 - 二、输入描述
 - 三、输出描述
 - 四、解题思路
 - 五、Java算法源码
 - 六、效果展示
 
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述
某云短信厂商,为庆祝国庆,推出充值优惠活动。现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。
二、输入描述
- 第一行客户预算M,其中 0 ≤ M ≤ 10^6
 - 第二行给出售价表, P1, P2, … Pn , 其中 1 ≤ n ≤ 100 ,
 
Pi为充值 i 元获得的短信条数。
1 ≤ Pi ≤ 1000 , 1 ≤ n ≤ 100
三、输出描述
最多获得的短信条数。
四、解题思路
- 读取输入的客户预算 budget 和优惠售价序列 list;
 - 创建一个长度为 budget + 1 的数组 dp,用于存储在不同预算下可获得的最多短信条数;
 - 使用动态规划计算最多获得的短信条数: 
  
- 遍历优惠售价序列 list,对于每个售价 i,遍历从0到预算的所有金额 j。
 - 如果当前金额 j 大于等于当前售价 i,更新 dp[j] 为 dp[j] 和 dp[j - i] + list.get(i - 1) 的较大值,其中 dp[j - i] 表示在剩余预算为 j - i 的情况下获得的短信条数,list.get(i - 1) 表示当前售价 i 对应的短信条数。
 
 - 输出 dp[budget],即在给定预算下可获得的最多短信条数。
 
五、Java算法源码
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int budget = Integer.parseInt(in.nextLine());
    List<Integer> list = Arrays.stream(in.nextLine().split(" "))
            .map(Integer::parseInt)
            .collect(Collectors.toList());
    int[] dp = new int[budget + 1];
    /**
     * 使用动态规划计算最多获得的短信条数
     * dp[i]表示在有i元预算的情况下,客户最多可以获得的短信条数。
     * 对于每个售价,遍历从0到预算的所有金额,dp[j] = max(dp[j] , dp[j - i] + topupList.get(i - 1))的较大值,
     * 其中i为当前售价,j为当前金额。
     */
    for (int i = 0; i <= list.size(); i++) {
        for (int j = 0; j <= budget; j++) {
            if (!(i == 0 || j == 0 || j < i)) {
                dp[j] = Math.max(dp[j], dp[j - i] + list.get(i - 1));
            }
        }
    }
    System.out.println(dp[budget]);
}
 
六、效果展示

 
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

















![WordPress集成Argon主题[CentOS7]](https://img-blog.csdnimg.cn/d433cedd4bd046dcaa497511f4ee8d62.png#pic_center)


