华为 · 动态规划 · 算法编程题
华为 动态规划 n ≤ 10 时限 1 秒 / 256 MB

题目描述

爱丽丝正在为制作新的人偶准备素材。她需要购买 n 种不同的素材,每种素材的单价分别为 a_1, a_2, ..., a_n 。为了保证每一种人偶都能顺利完成,爱丽丝制定了一个严格的计划:她必须为每种素材至少购买一个。
现在爱丽丝手中恰好有 b 元,她希望知道有多少种不同的采购方案,能够恰好耗尽这 b 元预算。需要注意的是,即使两种素材的单价相同,它们也被视为不同的素材种类。

输入输出

输入描述
输入包含单组测试数据。
第一行包含一个整数 b ( 0 ≤ b ≤ 100 ),代表爱丽丝的总预算。
第二行包含若干个以空格分隔的整数,代表每种素材的单价 a_i ( 1 ≤ n ≤ 10, 1 ≤ a_i ≤ 50 )。
输出描述
输出一个整数,表示恰好耗尽预算的采购方案总数。
注意:答案可能超过 32 位整数的范围,请使用 64 位整数(如 C++ 中的 `long long`)。

样例共 1 组

样例 1 · 在样例中,预算为 10,有两种单价分别为 1 和 2 的素材。 1. 首先,每种素材必须至少买一个,消耗金额为 1 + 2 = 3 元。 2. 剩余预算为 10 - 3 = 7 元。 3. 使用单价为 1 和 2 的素材凑齐 7 元的方案共有 4 种: - 购买 7 个单价为 1 的素材。 - 购买 5 个单价为 1 的素材和 1 个单价为 2 的素材。 - 购买 3 个单价为 1 的素材和 2 个单价为 2 的素材。 - 购买 1 个单价为 1 的素材和 3 个单价为 2 的素材。 因此输出为 4。
输入
10
1 2
输出
4

算法解析依据充分

考点:动态规划

数据规模 n ≤ 10 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 10
  • 元素值域:b ≤ 100,a_i ≤ 50(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:动态规划

本题切入点

「每种至少买一个、恰好花完 b 元」的方案计数:先扣掉每种一个的基础花费,再用完全背包做方案数 DP,答案可能超 32 位需用 64 位整数。

把问题拆成子问题,用状态表示「已处理到哪儿」,靠转移方程递推。

思路框架(动态规划 通法 · 非本题专属)

  1. 定义状态:dp[i] / dp[i][j] 表示什么(这是最关键的一步,状态定义错就全错)。
  2. 写转移方程:当前状态由哪些更小的状态推来。
  3. 确定初始条件与遍历顺序(保证用到的状态已算好)。
  4. 确定答案取哪个状态;数值大时全程取模。

实现要点:一般是「先枚举阶段,再枚举状态,最后枚举决策」三层循环;空间大时可滚动数组优化。

复杂度:时间 O(状态数 × 转移代价) | 空间 O(状态数)

该范式的通法易错点

  • 状态定义不完整(漏了必要维度),导致子问题之间有后效性。
  • 初始化写错(尤其「恰好」与「至多」的初值差别)。
  • 遍历顺序与依赖方向不一致。

对照本题

  • 数据规模 n ≤ 10,允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 元素值域最大到 100 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 10 / 1 2 → 输出 4

在样例中,预算为 10,有两种单价分别为 1 和 2 的素材。

  1. 首先,每种素材必须至少买一个,消耗金额为 1 + 2 = 3 元。
  2. 剩余预算为 10 - 3 = 7 元。
  3. 使用单价为 1 和 2 的素材凑齐 7 元的方案共有 4 种:
    • 购买 7 个单价为 1 的素材。
    • 购买 5 个单价为 1 的素材和 1 个单价为 2 的素材。
    • 购买 3 个单价为 1 的素材和 2 个单价为 2 的素材。
    • 购买 1 个单价为 1 的素材和 3 个单价为 2 的素材。

因此输出为 4。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-04月23号留学生开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解