2025 A卷 200分 题型
本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!
本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》
华为OD机试真题《会议接待 /代表团坐车》:
目录
-
- 题目名称:会议接待 /代表团坐车
-
- 题目描述
- Java
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- python
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- JavaScript
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- C++
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
-
- 1. 输入处理
- 2. 字符串分割
- 3. 动态规划数组初始化
- 4. 动态规划核心逻辑
- 5. 输出结果
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- C语言
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- GO
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
-
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
题目名称:会议接待 /代表团坐车
- 知识点:动态规划(背包问题)
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团。为提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。
约束条件:
- 一个代表团只能上一辆车,且代表团人数(每个代表团人数≤30,总数量≤30)必须小于汽车容量(≤100)。
- 必须将车辆坐满,即所选代表团人数总和等于汽车容量。
输入描述:
- 第一行为各代表团人数,以英文逗号分隔(如
5,4,2,3,2,4,9
)。 - 第二行为汽车载客量(如
10
)。
输出描述:
- 输出坐满汽车的方案数量,若无解则输出
0
。
示例:
输入:
5,4,2,3,2,4,9
10
输出:
4
说明:
可能的组合为 [2,3,5]
、[2,4,4]
、[2,3,5]
、[2,4,4]
(允许重复选择不同索引的相同数值代表团,但每个代表团仅能被选一次)。
补充说明:
- 代表团人数按输入顺序排列,组合需严格满足总和等于汽车容量。
- 动态规划(背包问题)或回溯法为典型解法。
Java
问题分析
我们需要计算从代表团中选择若干代表团,使其人数之和等于汽车的容量,且每个代表团只能被选一次。这是一个典型的0-1背包问题,要求恰好装满背包的方案数。
解题思路
- 动态规划定义:
dp[j]
表示总和为j
的方案数。
- 状态转移:
- 遍历每个代表团人数
num
,从后向前更新dp[j]
:dp[j] += dp[j - num]
。
- 遍历每个代表团人数
- 初始化:
dp[0] = 1
,表示总和为0的方案数为1(不选任何代表团)。
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取代表团人数
String[] parts = scanner.nextLine().split(",");
int[] nums = new int[parts.length];
for (int i = 0; i < parts.length; i++) {
nums[i] = Integer.parseInt(parts[i]);
}
// 读取汽车容量
int capacity = Integer.parseInt(scanner.nextLine());
int[] dp = new int[capacity + 1];
dp[0] = 1; // 初始化:总和为0的方案数为1(不选任何代表团)
// 动态规划处理每个代表团人数
for (int num : nums) {
// 从后向前遍历,确保每个代表团只被选一次
for (int j = capacity; j >= num; j--) {
dp[j] += dp[j - num];
}
}
// 输出结果
System.out.println(dp[capacity]);
}
}
代码详细解析
-
输入处理:
- 使用
Scanner
读取输入,将代表团人数分割为整数数组nums
。 - 读取汽车容量
capacity
。
- 使用
-
动态规划数组初始化:
dp
数组长度为capacity + 1
,初始时dp[0] = 1
,其余为0。
-
遍历每个代表团人数:
- 对每个
num
,从capacity
到num
逆序遍历,更新dp[j]
:for (int j = capacity; j >= num; j--) { dp[j] += dp[j - num]; }
- 逆序遍历确保每个代表团仅被考虑一次(0-1背包特性)。
- 对每个
-
输出结果:
dp[capacity]
存储了恰好装满汽车的方案数。
示例测试
示例1输入:
5,4,2,3,2,4,9
10
输出:
4
解析:
可能的组合为:
- 5(索引0)、2(索引2)、3(索引3)
- 4(索引1)、4(索引5)、2(索引4)
- 5(索引0)、2(索引4)、3(索引3)
- 4(索引1)、4(索引5)、2(索引2)
示例2输入:
2,2
4
输出:
1
解析:
唯一方案:选择两个2(不同索引)。
示例3输入:
1,1,1
3
输出:
1
解析:
唯一方案:选择所有三个1。
综合分析
-
时间复杂度:O(N×C)
N
为代表团数量,C
为汽车容量。每个代表团需遍历C
次。
-
空间复杂度:O©
- 仅需一个长度为
C+1
的数组。
- 仅需一个长度为
-
优势:
- 高效准确:动态规划严格保证最优解。
- 空间优化:一维数组节省内存。
- 处理大容量:使用
int
数组避免溢出(假设结果在int
范围内)。
-
适用场景:
- 代表团数量较大(如
N=30
),汽车容量适中(如C=100
)。
- 代表团数量较大(如
python
问题分析
我们需要从代表团中选择若干代表团,使它们的人数之和等于汽车容量,且每个代表团只能被选一次。这是一个典型的0-1背包问题,要求恰好装满背包的方案数。
解题思路
- 动态规划定义:
dp[j]
表示总和为j
的方案数。
- 状态转移:
- 遍历每个代表团人数
num
,从后向前更新dp[j]
:dp[j] += dp[j - num]
。
- 遍历每个代表团人数
- 初始化:
dp[0] = 1
,表示总和为0的方案数为1(不选任何代表团)。
代码实现
def main():
import sys
# 读取输入
input_lines = sys.stdin.read().splitlines()
nums = list(