#9881. 【基础】简单背包问题
【基础】简单背包问题
🎒 简单背包判定(子集和)
📘 题目描述
设有一个背包,其最大可承载重量为 s
。现有 n
件物品,每件物品的重量为正整数 w₁, w₂, ..., wₙ
。
请判断是否可以从这些物品中选出若干件,使得它们的总重量 **正好等于 s
**。
📥 输入格式
第一行包含两个整数:
s n
s
表示背包容量(1 ≤ s ≤ 32767)n
表示物品数量(1 ≤ n ≤ 50)
第二行包含 n
个正整数,表示每件物品的重量 w₁, w₂, ..., wₙ
。
📤 输出格式
- 如果存在一种选法能使得物品重量之和为
s
,输出:
YES
- 否则输出:
NO
📌 输入样例
20 5
1 3 5 7 9
📌 输出样例
YES
💡 解题思路
本题为经典 子集和判定问题,可以采用动态规划(DP)求解:
- 定义布尔数组
dp[i]
表示:是否能用某些物品组合出重量为i
; - 初始状态:
dp[0] = true
; - 状态转移:对每个物品
w
,从后往前更新:
for (int i = s; i >= w; --i)
dp[i] = dp[i] || dp[i - w];
- 最终看
dp[s]
是否为true
。