华为OD机试 - 云短信平台优惠活动 - 动态规划、背包问题(Java 2024 C卷 200分)

本博客详细介绍了华为OD机试中的一道动态规划题目,涉及云短信平台的充值优惠活动。通过动态规划解决背包问题,最大化在给定预算下获得的短信条数。博客提供了解题思路、Java算法源码和优化方法,并展示了输入输出示例。

一、题目描述

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

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

二、输入描述

第一行客户预算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 
### 华为OD模式2024 E程序员题解析 #### 一、出租车计费问题 此问题是关于计算实际产生的出租车费用。给定一个计费表的表面读数,需返回按照特定规则计算的实际费用[^3]。 以下是解决该问题的一个可能实现方式: ```java import java.util.Scanner; public class TaxiFare { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int surfaceReading = scanner.nextInt(); // 输入计价器显示金额 double actualCost = calculateActualCost(surfaceReading); // 计算实际花费 System.out.println((int)actualCost); // 输出结果 } private static double calculateActualCost(int surfaceReading) { if (surfaceReading <= 10) { // 初始起步价范围 return Math.min(10, surfaceReading * 1.2); // 起步阶段按比例增加 } else { return 12 + (surfaceReading - 10) * 1.5; // 后续每公里加收费用 } } } ``` 上述代码实现了基于输入的计费表表面读数来计算实际应支付的费用逻辑。 --- #### 二、货币单位换算问题 此类问题涉及不同货币之间的转换关系以及如何处理精度误差等问题。通常会提供一组汇率数据,并要求编写程序完成指定金额在多种货币间的相互转换[^2]。 下面是一个简单的例子展示如何进行基本的货币单位换算: ```python def currency_conversion(amount, from_currency, to_currency, rates): """ :param amount: 需要兑换的数量 :param from_currency: 原始货币种类 :param to_currency: 目标货币种类 :param rates: 汇率字典 {"USD": {"CNY": 7}, ...} :return: 对应的目标货币数量 """ rate = rates[from_currency][to_currency] converted_amount = round(amount * rate, 2) return converted_amount if __name__ == "__main__": exchange_rates = { "USD": {"CNY": 7}, "EUR": {"CNY": 8}, "GBP": {"CNY": 9} } result = currency_conversion(100, 'USD', 'CNY', exchange_rates) print(result) # 输出应该接近于700 CNY ``` 以上脚本定义了一个函数用于执行基础版的跨币种价值映射过程。 --- #### 三、猜字谜游戏 这类题目主要考察字符串的操作能力,比如查找子串位置、替换字符或者统计频率等操作。 这里给出一段Python代码片段作为参考解决方案之一: ```python def solve_riddle(riddle_str, target_char): occurrences = riddle_str.count(target_char) first_index = riddle_str.find(target_char) return f"The character '{target_char}' appears {occurrences} times and its first occurrence is at index {first_index}." riddle_string = input("Enter the riddle string:") search_character = input("Which character do you want to search?") solution_message = solve_riddle(riddle_string, search_character) print(solution_message) ``` 通过这段代码可以轻松解答有关某个特殊符号在整个句子中的布情况之类的谜语型挑战。 --- #### 四、其他常见算法类考题 除了上述具体应用场景外,在华为ODE中还可能出现一些经典的计算科学领域内的理论知识测项目,例如但不限于广度/深度优先遍历树形结构、动态规划求解背包问题等等[^1]。 对于这些类型的考核内容,则往往需要考生具备扎实的数据结构基础知识以及灵活运用各种经典算法的能力才能顺利应对。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值