华为OD机试 2025B卷 - 小明减肥
时间: 2025-05-28 08:49:35 浏览: 132
### 关于华为OD机试2025B卷中小明减肥的算法题
#### 题目描述
小明计划通过锻炼来减轻体重。他每天可以选择不同的运动方式,每种运动消耗一定的卡路里并花费一定的时间完成。为了达到最佳效果,小明希望在有限时间内最大化燃烧的总卡路里数。
给定一系列活动及其对应的卡路里消耗和所需时间,以及一天内的最大可用时间,请设计一种方法帮助小明制定最优方案,在不超过规定时间的前提下实现最大的卡路里消耗目标。
此问题属于经典的 **动态规划 (Dynamic Programming)** 类型[^1]。
---
#### 动态规划解决思路
定义状态 `dp[i][j]` 表示从前 `i` 种活动中选取若干项,并且总耗时不超过 `j` 的情况下能够获得的最大卡路里消耗量。
转移方程如下:
- 如果不选第 `i` 项,则 `dp[i][j] = dp[i-1][j]`;
- 如果选择第 `i` 项(前提是该活动所需的耗时小于等于当前剩余时间),则有
`dp[i][j] = max(dp[i-1][j], dp[i-1][j-t_i]+c_i)`,
其中 `t_i` 和 `c_i` 分别表示第 `i` 项活动所耗费时间和对应能减少的卡路里数量。
初始条件设置为当没有任何项目可选 (`i=0`) 或者没有剩余时间可供分配(`j=0`) 时候均为零即 `dp[0][*]=dp[*][0]=0`.
最终答案存储于变量 `dp[n][T_max]`, 这里的 n 是总的活动数目而 T_max 则代表每日允许使用的最长小时数.
---
#### 示例代码实现 (Python)
以下是基于以上理论的一个简单实现:
```python
def max_calories_burned(activities, time_limit):
"""
计算在限定时间内可以烧掉的最大卡路里
:param activities: list of tuples [(time_required_1, calories_burned_1), ...]
:param time_limit: int 总共有的时间限制
:return: int 可以得到的最大卡路里值
"""
num_activities = len(activities)
# 初始化 DP 数组
dp = [[0]*(time_limit+1) for _ in range(num_activities+1)]
for i in range(1, num_activities + 1):
t_i, c_i = activities[i-1] # 当前活动的时间需求与卡路里贡献
for j in range(time_limit + 1):
if j >= t_i:
dp[i][j] = max(dp[i-1][j], dp[i-1][j - t_i] + c_i)
else:
dp[i][j] = dp[i-1][j]
return dp[num_activities][time_limit]
# 测试数据
if __name__ == "__main__":
test_activities = [(3, 40), (4, 50), (2, 20)] # 每个元组形式为 (所需时间, 减少的卡路里)
total_time_available = 6 # 设定总共拥有的时间为6个小时
result = max_calories_burned(test_activities, total_time_available)
print(f"Maximum Calories Burned within {total_time_available} hours is {result}")
```
上述程序展示了如何利用二维数组构建动态规划表解决问题的过程[^1].
---
#### 复杂度分析
- 时间复杂度 O(n*T),这里n指代的是不同种类的任务总数,T则是设定好的最长时间界限.
- 空间复杂度同样也是 O(n*T).
这种解法虽然占用较多内存空间但是由于其清晰易懂所以非常适合用来处理此类背包类别的优化难题[^1].
---
阅读全文
相关推荐






