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,且每个产品的投资额不超过其最大额度。