查找充电设备组合

题目描述

某个充电站, 可提供 n 个充电设备, 每个充电设备均有对应的输出功率.

任意个充电设备组合的输出功率总和, 均构成功率集合 P 的 1 个元素.

功率集合 P 的最优元素, 表示最接近充电站最大输出功率 p_max 的元素.

输入描述

输入为 3 行:

  • 第 1 行为充电设备个数 n
  • 第 2 行为每个充电设备的输出功率
  • 第 3 行为充电站最大输出功率 p_max

备注:

  • 充电设备个数 n > 0
  • 最优元素必须小于或等于充电站最大输出功率 p_max

输出描述

功率集合 P 的最优元素.

示例1

输入:

4
50 20 20 60
90

输出:

90

示例2

输入:

2
50 40
30

输出:

0

示例3

输入:

3
1 2 3
5

输出:

5

题解

Python

def main():
    # 读取输入
    # 机器数量
    num_machines = int(input())
    assert 0 < num_machines
    # 每台机器的输出功率
    machine_powers = list(map(int, input().split()))
    assert len(machine_powers) == num_machines
    # 最大输出功率
    max_power = int(input())

    # 背包问题, DP
    # 思路一: 暴力法, 时间复杂度 O(2^n)

    target_power = 0

    def recursive(machine_index, power_sum):
        # 所有机器都访问完了
        if machine_index >= num_machines:
            diff = max_power - power_sum
            nonlocal target_power
            if 0 <= diff < (max_power - target_power):
                target_power = power_sum
            return

        # 递归调用
        recursive(machine_index + 1, power_sum + machine_powers[machine_index])
        recursive(machine_index + 1, power_sum)

    recursive(0, 0)

    # 打印结果
    print(target_power)

if __name__ == "__main__":
    main()