The main insight: when you pick a number, you can pick it again. So when you recurse, you pass the same start index instead of incrementing it.
For example, if you pick from , your next call still starts at index (where is). This lets you pick again. Once you decide to skip , you move to index and try .
Base case: when your sum equals the target, add the current combination to results. If sum exceeds target, stop exploring that path.