zoukankan      html  css  js  c++  java
  • [Algorithm] Dynamic programming: Find Sets Of Numbers That Add Up To 16

    For a given array, we try to find set of pair which sums up as the given target number.

    For example, we are given the array and target as:

    const data = [2, 4, 6, 10];
    const target = 16;

    We should be able to find 2 pair, which sum up to 16:

    {2,4,10}
    {6,10}

    We need to create a function to return the number of pair we found, in this case, the answer is: 2

    const data = [2, 4, 6, 10];
    /**
     * Return number of pair found
     */
    function DP(data, target = 16) {
      let memo = {};
      return rc(data, target, data.length - 1, memo);
      function rc(data, target, i, memo) {
        // Construct the key - value for memo
        let key = `${target}-${i}`;
        // Store the result
        let res = 0;
        // return the value if already calcualte
        if (memo[key]) {
          return memo[key];
        }
        // if the target is zero, then it is empty set, return 1
        if (target === 0) {
          return 1;
        } else if (target < 0) {
          // if target < 0, we don't consider the case, return 0
          return 0;
        } else if (i < 0) {
          // if i <0, means we run out of element, return 0
          return 0;
        }
        // if current value is larger than targer, we continue with next value
        if (data[i] > target) {
          res = rc(data, target, i - 1, memo);
        } else {
          /**
           * Two cases:
           * 1. The current value is not include:
           *  rc(data, target, i - 1, memo)
           * 2. The current value is include: the rest of els should sum up to new target value
           *  rc(data, target - data[i], i - 1, memo)
           */
          // i is not included + i is included
          res =
            rc(data, target, i - 1, memo) + rc(data, target - data[i], i - 1, memo);
        }
        memo[key] = res;
        return res;
      }
    }
    
    console.log(DP(data, 16)); // 2

    Time complexity: O(target * n * 2 + 1) = O(T*N)

  • 相关阅读:
    三联生活周刊:女游戏设计师之死
    HTML
    营运社区所需要的基本心理学常识
    对C++下struct 和 类默认继承的认识
    什么是列表?
    什么是个人网站?
    DevExpress ASPxListBox can't get selected items after postback
    ListItemEventHandler does not fire on the prospective list
    SPF和SharePoint Server的区别
    什么是网站?
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10393635.html
Copyright © 2011-2022 走看看