zoukankan      html  css  js  c++  java
  • Leetcode: Combination Sum IV && Summary: The Key to Solve DP

    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.
    Follow up:
    What if negative numbers are allowed in the given array?
    How does it change the problem?
    What limitation we need to add to the question to allow negative numbers?

    DP 解法: the key to solve DP problem is to think about how to create overlap, how to re-solve subproblems(怎么制造复用)

    Bottom up dp:

     1 public class Solution {
     2     public int combinationSum4(int[] nums, int target) {
     3         if (nums==null || nums.length==0) return 0;
     4         Arrays.sort(nums);
     5         int[] dp = new int[target+1];
     6         dp[0] = 1;
     7         for (int i=1; i<=target; i++) {
     8             for (int j=0; j<nums.length && nums[j]<=i; j++) {
     9                 dp[i] += dp[i-nums[j]];
    10             }
    11         }
    12         return dp[target];
    13     }
    14 }

    Better Solution(Bottom-up)不sort也成:

     1 public int combinationSum4(int[] nums, int target) {
     2     int[] comb = new int[target + 1];
     3     comb[0] = 1;
     4     for (int i = 1; i < comb.length; i++) {
     5         for (int j = 0; j < nums.length; j++) {
     6             if (i - nums[j] >= 0) {
     7                 comb[i] += comb[i - nums[j]];
     8             }
     9         }
    10     }
    11     return comb[target];
    12 }

    Follow up:

    I think if there are negative numbers in the array, we must add a requirement that each number is only used one time, or either positive number or negative number should be used only one time, otherwise there would be infinite possible combinations.
    For example, we are given:
    {1, -1}, target = 1,
    it's obvious to see as long as we choose n 1s and (n-1) -1s, it always sums up to 1, n can be any value >= 1.

  • 相关阅读:
    Revit API改变风管及管件尺寸
    Revit API注册事件
    Revit API创建标高,单位转换
    Revit API判断直线相交关系移动风管
    Revit MEP API找到连接器连接的连接器
    Revit MEP API连接器类别
    AngularJS如何编译和呈现页面
    AngularJS自定义Directive初体验
    Webpack基本用法
    对一个前端AngularJS,后端OData,ASP.NET Web API案例的理解
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6108838.html
Copyright © 2011-2022 走看看