华为OD机试真题——虚拟理财游戏(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 200分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《虚拟理财游戏》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C
GO
题目名称:虚拟理财游戏
- 知识点:贪心算法、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
在一款虚拟游戏中,玩家需通过投资理财产品增强资产以避免淘汰。现有一家Bank提供 m 个理财产品,每个产品有不同投资回报率、风险值和最大投资额度。玩家拥有 N 元资金,可接受的总风险值为 X。要求选择最优投资组合(最多选2个产品),在总风险不超过 X 且总投资不超过 N 的条件下,最大化投资回报(投资额×回报率)。
备注:
- 总风险值为所选产品风险值之和;
- 最多投资2个产品;
- 投资额必须为整数;
- 回报=投资额×回报率。
输入描述:
- 第一行:产品数 m(1≤m≤20)、总投资额 N(1≤N≤10000)、可接受总风险 X(1≤X≤200);
- 第二行:产品回报率序列(整数,1≤值≤60);
- 第三行:产品风险值序列(整数,1≤值≤100);
- 第四行:产品最大投资额度序列(整数,1≤值≤10000)。
输出描述:
每个产品的投资额序列(未投资则为0)。
示例:
输入:
5 100 10
10 20 30 40 50
3 4 5 6 10
20 30 20 40 30
输出:
0 30 0 40 0
说明:投资第2、4个产品,风险4+6=10,回报30×20+40×40=2200。
Java
问题分析
题目要求选择最多两个理财产品,在总风险不超过X且总投资不超过N的条件下,最大化投资回报。需处理以下关键点:
- 风险控制:所选产品的风险值之和 ≤ X。
- 资金限制:投资额 ≤ 产品最大额度,且总和 ≤ N。
- 回报最大化:通过合理分配资金,使总回报最大。
解题思路
- 单产品选择:遍历每个产品,计算其合法投资的最大回报。
- 双产品组合:遍历所有产品对,确定优先级(回报率高的先投资),计算最大回报。
- 动态更新:维护当前最大回报及对应的投资方案。
代码实现
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取输入数据int m = scanner.nextInt();int N = scanner.nextInt();int X = scanner.nextInt();int[] returnRate = new int[m];for (int i = 0; i < m; i++) {returnRate[i] = scanner.nextInt();}int[] risk = new int[m];for (int i = 0; i < m; i++) {risk[i] = scanner.nextInt();}int[] maxInvest = new int[m];for (int i = 0; i < m; i++) {maxInvest[i] = scanner.nextInt();}int maxReturn = 0;int[] result = new int[m];// 处理单个产品的情况for (int i = 0; i < m; i++) {if (risk[i] > X) continue; // 风险超标跳过int invest = Math.min(maxInvest[i], N);int currentReturn = returnRate[i] * invest;if (currentReturn > maxReturn) {maxReturn = currentReturn;Arrays.fill(result, 0);result[i] = invest;}}// 处理两个产品的组合for (int i = 0; i < m; i++) {for (int j = i + 1; j < m; j++) {int totalRisk = risk[i] + risk[j];if (totalRisk > X) continue; // 总风险超标跳过// 确定投资顺序:优先投回报率高的int first, second;if (returnRate[i] >= returnRate[j]) {first = i;second = j;} else {first = j;second = i;}// 计算最大投资额int investFirst = Math.min(maxInvest[first], N);int remaining = Math.max(N - investFirst, 0);int investSecond = Math.min(maxInvest[second], remaining);// 计算总回报int total = returnRate[first] * investFirst + returnRate[second] * investSecond;// 更新最优解if (total > maxReturn) {maxReturn = total;Arrays.fill(result, 0);result[first] = investFirst;result[second] = investSecond;}}}// 输出结果for (int i = 0; i < m; i++) {System.out.print(result[i] + (i == m - 1 ? "\n" : " "));}}
}
代码解析
- 输入处理:读取产品数
m
、总资金N
、风险阈值X
及三个数组。 - 单产品遍历:
- 检查风险是否超标。
- 计算最大投资额,更新最优解。
- 双产品遍历:
- 检查总风险是否超标。
- 根据回报率确定投资顺序。
- 计算两个产品的最大投资额及总回报。
- 动态更新最优解。
- 结果输出:按格式输出每个产品的投资额。
示例测试
-
示例输入:
5 100 10 10 20 30 40 50 3 4 5 6 10 20 30 20 40 30
输出:
0 30 0 40 0
解释:选择产品2和4,总风险4+6=10,回报30×20 +40×40=2200。
-
测试用例1:
2 100 5 30 40 3 4 50 60
输出:
0 60
解释:仅选产品2(风险4 ≤5),投资60元。
-
测试用例2:
3 50 8 15 25 20 2 3 4 20 20 20
输出:
0 20 20
解释:选产品2和3,总风险3+4=7 ≤8,回报25×20 +20×20=900。
综合分析
-
时间复杂度:
- 单产品遍历:O(m)。
- 双产品遍历:O(m²)。
- 综合复杂度:O(m²),在m≤20时完全可行。
-
空间复杂度:
- 存储输入数组及结果数组:O(m)。
-
正确性:
- 严格处理风险、资金及回报率逻辑,确保最优解正确。
-
优势:
- 贪心策略:优先投资高回报产品,确保局部最优。
- 全面覆盖:处理所有合法组合,不漏解。
-
适用性:
- 完全符合题目约束,适用于大范围输入数据。
python
问题分析
题目要求在给定资金和风险限制下,选择最多两个理财产品,使得总回报最大化。需满足总风险不超过X,总投资不超过N,且每个产品的投资额不超过其最大额度。