华为OD机考2025C卷 - 小明减肥 (Java & Python& JS & C++ & C )

最新华为上机考试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
2025华为od机试2025C卷-华为OD上机考试2025年C卷

题目描述

小明有n个可选运动,每个运动有对应卡路里,想选出其中k个运动且卡路里和为t。k,t,n都是给定的。求出可行解数量

输入描述

第一行输入 n t k

第一行输入 每个运动的卡路里 按照空格进行分割

备注

  • 0 < n < 10
  • t > 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的不同组合数量。思路如下:

解题思路

  1. 定义状态

    • dp[j][m]表示选择j个运动,卡路里总和为m的组合数量。
  2. 初始化状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值