• Leetcode 377.组合总和IV


    组合总和IV

    给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

    示例:

    nums = [1, 2, 3]

    target = 4

    所有可能的组合为:

    (1, 1, 1, 1)

    (1, 1, 2)

    (1, 2, 1)

    (1, 3)

    (2, 1, 1)

    (2, 2)

    (3, 1)

    请注意,顺序不同的序列被视作不同的组合。

    因此输出为 7

    进阶:
    如果给定的数组中含有负数会怎么样?
    问题会产生什么变化?
    我们需要在题目中添加什么限制来允许负数的出现?

    解题思路:

    使用递归的方法做这个题会超时,

    因此根据这道题的解法提示选择使用DP的方法,这时我们需要一个一维数组dp大小为target+1,从对应dp[i]存储的是目标i时所得的组合数,然后我们从dp[1]开始计算直到dp[target],每次计算dp[i]时的方法是,从头开始遍历nums数组,如果i>=nums[j], dp[i] = dp[i] + dp[i-nums[j]],

    (比如题目中的例子[1,2,3]

    计算dp[1] :

    从头开始遍历nums

    当j =0时 因为1 >= nums[0] 故 dp[1] = dp[1]+dp[1- nums[0]],即

    dp[1] = dp[1]+dp[0] = 1;

    当j=1 时 因为1 < nums[1] 故 不再运算 故dp[1] = 1;

    计算 dp[2]:

    当j =0时 因为2 >= nums[0] 故 dp[2] = dp[2]+dp[2- nums[0]],即

    dp[2] = dp[2]+dp[1] = 1;

    当j =1时 因为2 >= nums[1] 故 dp[2] = dp[2]+dp[2- nums[1]],即

    dp[2] = dp[2]+dp[0] = 2;

    当j=2 时 因为2 < nums[2] 故 不再运算 故dp[2] = 2;

     1 import java.util.Arrays;
     2 
     3 public class Solution{
     4     public int combinationSum4(int[] nums,int target){
     5         int result=0;
     6         int[] dp=new int[target+1];
     7         dp[0]=1;
     8         Arrays.sort(nums);
     9         for(int i=1;i<target+1;i++){
    10             for(int num:nums){
    11                 if(i>=num){
    12                     dp[i]=dp[i]+dp[i-num];
    13                 }else{
    14                     break;
    15                 }
    16             }
    17         }
    18         result=dp[target];
    19         return result;
    20     }
    21 }

  • 相关阅读:
    MFC下拉框使用方法
    C++学习之路,漫长而遥远
    [转载]浅析STL allocator
    [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法
    回溯算法之n皇后问题
    算法练习之一
    Windows配置JDK and TOMCAT
    搭建openstack allinone版本
    在ms08_067_netapi中添加2003的Chinese版本
    msfvenom各平台木马生成
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235346.html
Copyright © 2020-2023  润新知