【LEETCODE】377- Combination Sum IV [Python]

题目:

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 = 4

The 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值