小明减肥
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
小明有n个可选运动,每个运动有对应卡路里,想选出其中k个运动且卡路里和为t。k,t,n都是给定的。求出可行解数量
输入描述
第一行输入 n t k
第一行输入 每个运动的卡路里 按照空格进行分割
备注
0 < n < 10t > 0, 0 < k <= n- 每个运动量的卡路里 > 0
输出描述
求出可行解数量
示例1
输入
4 3 2
1 1 2 3
输出
2
说明
可行解为2,选取{0, 2}, {1,2}两种方式。
解题思路
暴力回溯
这个问题的核心目标是选出 k 个运动,使得它们的卡路里总和恰好是 t。由于运动的数量 n 较小(0 < n < 10),我们可以利用回溯(Backtracking)算法来穷举所有可能的组合,从中找到符合条件的组合。
回溯函数 backtrack:
- 函数接受当前的运动索引
index,还需要选择的运动数量k,以及目标卡路里t和当前已经选取的卡路里和currentSum以及已选运动的数量count。 - 终止条件:
- 如果已经选出了
k个运动且它们的卡路里和正好等于t,则找到一种有效组合,返回 1。 - 如果当前运动超出数组边界,或已选运动数量达到了
k,或当前的卡路里和超过了t,则返回 0,表示这一条路径不再有效。
- 如果已经选出了
- 递归选择:
- 选择当前运动并递归继续寻找其他运动,更新当前总和和已选数量。
- 不选择当前运动,则直接递归查找下一个运动。
- 最后将两种选择的结果相加,返回总的有效组合数。
动态规划
这个问题还可以通过动态规划来解决,目标是找到选择k个运动使得卡路里总和为t的不同组合数量。思路如下:
解题思路
-
定义状态:
- 设
dp[j][m]表示选择j个运动,卡路里总和为m的组合数量。
- 设
-
初始化状态:
dp[0][0] = 1,因为选择0个运动使得卡路里和为0的方式只有一种,即什么都不选择。- 其他状态
订阅专栏 解锁全文
&spm=1001.2101.3001.5002&articleId=156544063&d=1&t=3&u=88a1910b6d3c483c8767842ecc8a7102)
150

被折叠的 条评论
为什么被折叠?



