华为OD机试 - 云短信平台优惠活动 - 回溯(Java 2023 B卷 200分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某云短信厂商,为庆祝国庆,推出充值优惠活动。

现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。

二、输入描述

第一行客户预算M,其中 0<=M<=1000000。

第二行给出售价表,P1,P2…Pn, 其中 1<=n<=100,Pi为充值i元获得的短信条数。 1<=Pi<=1000, 1<=n<=100。

三、输出描述

最多获得的短信条数。

四、解题思路

  1. 如果客户预算小于0 或者 已计算的元素下角标大于客户预算,返回当前短信条数;
  2. 从已计算的元素下角标开始遍历出售价表;① 计算充值金额为i+1元时获得的短信条数,递归调用(客户预算、出售价表、短信条数msgCount + arr[i]、已计算的元素下角标);② 计算未选择当前售价时获得的短信条数p2,递归调用,③ 更新max,为max、p1、p2中的最大值;
  3. 返回最多获得的短信条数;

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 客户预算M
    Integer M = Integer.parseInt(sc.nextLine());
    // 出售价表
    int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    System.out.println(getMaxMsgCount(M, arr, 0, 0));
}

/**
 *
 * 获取最多短信条数
 * @param money 客户预算
 * @param arr 出售价表
 * @param msgCount 短信条数
 * @param usedIndex 已计算的元素下角标
 * @return
 */
private static int getMaxMsgCount(Integer money, int[] arr, int msgCount, int usedIndex) {
    // 1、如果客户预算小于0 或者 已计算的元素下角标大于客户预算,返回当前短信条数
    if (money <= 0 || usedIndex > money) {
        return msgCount;
    }
    // 最多获得的短信条数
    int max = Integer.MIN_VALUE;
    // 2、从已计算的元素下角标开始遍历出售价表
    for (int i = usedIndex; i < arr.length; i++) {
        int p1 = 0;
        if (money - i - 1 >= 0) {
            // 2.1 计算充值金额为i+1元时获得的短信条数
            // 递归调用(客户预算、出售价表、短信条数msgCount + arr[i]、已计算的元素下角标)
            p1 = getMaxMsgCount(money - i - 1, arr, msgCount + arr[i], usedIndex);
        }
        // 2.2 计算未选择当前售价时获得的短信条数p2,递归调用
        int p2 = getMaxMsgCount(money, arr, msgCount, usedIndex + 1);
        // 2.3 更新max,为max、p1、p2中的最大值
        max = Math.max(max, Math.max(p1, p2));
    }
    // 3、返回最多获得的短信条数
    return max;
}

六、效果展示

1、输入

10
10 20 30 50 70 100

2、输出

150

3、说明

分两次充值最优,4元、6元各充一次。总条数 50+100=150

华为OD机试 - 云短信平台优惠活动 - 回溯(Java 2023 B卷 200分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,算法,七日集训,送书,学习方法)