" 这是一个典型的动态规划问题,我们可以使用回溯法来解决。首先,我们需要创建一个数组dp,其中dp[i]表示是否包含nums[i]这个元素。初始时,dp[0]和dp[1]都设为true,因为数组的前两个元素一定包含在结果中。然后,我们可以遍历数组,对于每个元素nums[i],如果dp[i-1]为true,则我们可以选择将其加入结果,即dp[i] = dp[i-1];否则,我们可以选择不将其加入结果,即dp[i] = false。当遍历完整个数组后,我们可以通过检查dp数组来找到满足条件的所有组合。
具体实现如下:
```python
def backtrack(nums, target, start, path, res):
if target == 0:
res.append(path)
return
if target < 0:
return
for i in range(start, len(nums)):
if path and path[-1] == nums[i]:
continue
path.append(nums[i])
backtrack(nums, target - nums[i], i + 1, path, res)
path.pop()
def combinationSum(nums, target):
res = []
backtrack(nums, target, 0, [], res)
return res
```
这里,`backtrack`函数是回溯的核心逻辑,`combinationSum`函数用于调用回溯并返回结果。例如,对于输入`[2, 3, 6, 7]`和`target=7`,调用`combinationSum`函数将返回`[[2, 2, 3], [7]]`,表示满足条件的所有组合。"