描述
case
- input
- [1, 5, 11, 5]
- output
- True. s1 = {1, 5, 5} s2 = {11}
递归解法
思路:
- 元素要么选, 要么不选. 假设存在s1集合, 那么S种元素要么在集合s1种,要么不在
```python
def backtrack(nums: [int], i: int, target: int) -> bool:
base case
if i == len(nums):
else: # 要么选择要么不选择if target == 0:return Truereturn False
return backtrack(nums, i + 1, target) or backtrack(nums, i + 1, target - nums[i])
if name == ‘main‘: nums = [1, 2, 3, 4, 5] print(backtrack(nums, 0, sum(nums) / 2))
<a name="q5JX4"></a>## 动态规划解法- `dp[i][j]` 物品:[1-i],任选(0、1),是否刚好能填满背包容量j, 注意 `basecase`- 状态转移方程```pythondef sub_package(nums, W):def func(x: []):# dp[i][j]: 物品:[1-i],任选(0、1),是否刚好能填满背包容量j# dp数组初始化,basecasedp = [[False for j in range(W + 1)] for i in range(len(nums) + 1)]for row in range(len(nums) + 1):dp[row][0] = Truefor i in range(1, len(nums) + 1): # 物品for j in range(1, W + 1): #if nums[i - 1] <= j: #dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]]else:dp[i][j] = dp[i - 1][j]for row in dp:print(row)if __name__ == '__main__':nums = [1, 2, 3, 6]sub_package(nums, 6)
