题目:
https://leetcode.com/problems/combination-sum-iv/
Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3]
target = 4The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)Note that different sequences are counted as different combinations.
Therefore the output is 7.
题意:
Given a sequence of positive integers, and a target, to find how many kinds of combinations among the sequence can be equal to the target, and different orders will be counted as different combinations.
分析:
Intuitively,
we can start from choosing 1 as the first number,
and the combination will be:
only 1, ->’1 1 1 1’,
or 1 , 2, and the remaining is 1, with considering the order ->’1+ 2 1’ , ‘1+ 1 2’
or 1,3, ->’1+3’
then start from 2, and the combination will be: ‘2+1 1’, ‘2+2’
at last start from 3, the combination will be: ‘3+1’
But, this is difficult for coding.
Step 1: The structure
Simply,
For the target 4,
if we choose ‘1’ from the nums as the first position, since 4=’1’+3,
then the combination count of 4=combination count of 3.
in order, if we choose ‘2’ from the nums as the first position, since 4=’2’+2, then the combination count of 4=combination count of 2.
then, if we choose ‘3’ from the nums as the first position, since 4=’3’+1, then the combination count of 4=combination count of 1.
mathematically, consider every x from nums,
combination(target)+=combination(target-x).
so we can solve this problem by Dynamic Programming, to solve the problem of combination(target), we can firstly solve the subproblem of combination(target-x).
Step 2: A recursive solution
Let dp[i] denote the quantity of combinations of target=i, and initialize dp as 0s.
If i==0, the quantity of combinations is 1.
If i>0, let’s traverse x from nums, and dp[i]=dp[i]+dp[i-x].
since i-x
Step 3: Computing the optimal costs
class Solution(object):
def combinationSum4(self, nums, target):
if nums==[]:
return 0
dp = [0]*(target+1)
dp[0] = 1
for i in range(1, target+1):
for x in nums:
if x<=i:
dp[i]+=dp[i-x]
return dp[target]
Notice:
- dp[0]=1
- if nums==[]: return 0, not 1