|  | @@ -0,0 +1,43 @@
 | 
	
		
			
				|  |  | +var empty struct{} = struct{}{}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func combinationSum4(nums []int, target int) int {
 | 
	
		
			
				|  |  | +	// res := make(map[string]struct{})
 | 
	
		
			
				|  |  | +	// dfs(nums, target, []int{}, &res)
 | 
	
		
			
				|  |  | +	// return len(res)
 | 
	
		
			
				|  |  | +	n := len(nums)
 | 
	
		
			
				|  |  | +	if n == 0 {
 | 
	
		
			
				|  |  | +		return 0
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	sort.Ints(nums)
 | 
	
		
			
				|  |  | +	dp := make([]int, target+1)
 | 
	
		
			
				|  |  | +	dp[0] = 1
 | 
	
		
			
				|  |  | +	for i := 1; i <= target; i++ {
 | 
	
		
			
				|  |  | +		for _, val := range nums {
 | 
	
		
			
				|  |  | +			if i < val {
 | 
	
		
			
				|  |  | +				break
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			dp[i] += dp[i-val]
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return dp[target]
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func dfs(nums []int, target int, pre []int, res *map[string]struct{}) {
 | 
	
		
			
				|  |  | +	if target < 0 {
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	} else if target == 0 {
 | 
	
		
			
				|  |  | +		(*res)[ints2str(pre)] = empty
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	for _, i := range nums {
 | 
	
		
			
				|  |  | +		dfs(nums, target-i, append(pre, i), res)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func ints2str(nums []int) string {
 | 
	
		
			
				|  |  | +	str := make([]string, len(nums))
 | 
	
		
			
				|  |  | +	for i, v := range nums {
 | 
	
		
			
				|  |  | +		str[i] = strconv.Itoa(v)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return strings.Join(str, ",")
 | 
	
		
			
				|  |  | +}
 |