377. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target
的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <=target <= 1000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combination-sum-iv
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/combination-sum-iv
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int cmp(int* px,int* py){
    return (*px)>(*py);
}
int combinationSum4(int* nums, int numsSize, int target){
    unsigned int dp[target+1];
    dp[0] = 1;
    
    qsort(nums,numsSize,sizeof(int),cmp); /排序后计算可以省略部分时间
    for(int i = 1; i <= target; i++)
    {
        dp[i] = 0;
        for(int j = 0; j < numsSize; j++)
        {
            int res = i - nums[j];
            if(res >= 0)
            {
                dp[i] += dp[res];
            }
            else
            {
                break;
            }
        }
    }

    return dp[target];
}

思路:动态规划
这个题目可以重复使用同一个数字,首先思考使用回溯算法,不过超时了。改用动态规划:一般考虑如何使用前面得到的结果来得到后面的结果。比如:nums:[1,2,3] target:4
那么使用dp数组记录计算过的数字,dp[i]表示target=i时,结果为dp[i]。那么dp[4]的结果可以这样想,dp[4] = dp[4-1] + dp[4-2] + dp[4-3],
dp[3] = dp[3-1] + dp[3-2] + dp[3-3] ,
dp[2] = dp[2-1] + dp[2-2],
dp[1] = dp[1-1]
那么状态转移方程就可以得到:
dp[i] = sum(dp[i - nums[j]) (i - nums[j] >= 0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值