题目
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]
思路
这是深度搜索思想的典型应用。例如搜索candidates=[1,2],target=3时的搜索路径。
公有两条路径满足:
[1,1,1]
[1,2]
实现代码
//assert:
//1. elements can be used more than once
//2. no duplicate elements.
public class Solution {
private IList<IList<int>> result = new List<IList<int>>();
private int[] nums;
public IList<IList<int>> CombinationSum(int[] candidates, int target)
{
nums = candidates;
Array.Sort(nums);
dfs(new List<int>(), target, 0);
return result;
}
private void dfs(List<int> tmp, int remain, int start)
{
if (remain < 0) return;
if (remain == 0)
result.Add(new List<int>(tmp)); //donot directly add tmp!!!
else
{
for (int i = start; i < nums.Length; i++)
{
tmp.Add(nums[i]);
dfs(tmp, remain - nums[i], i); //start shoud be set i!!!
tmp.RemoveAt(tmp.Count - 1); //remove last-index element in tmp
}
}
}
}