Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [Dynamic Programming] Can Sum

    Published Nov 08, 2021 [  DynamicProgramming  ]

    Problem

    Write a function canSum(targetSum, numbers) that takes in a target sum and an array of numbers as arguments.

    The function should return a boolean indicating whether or not it is possible to generate the target sum using numbers from the array.

    You may use an element of the array as many times as needed.

    You may assume that all input numbers are nonnegative

    Brute Force

    Subtract one value from numbers and check if we can get the remainder.

    const canSum = (targetSum, numbers) => {
        if(targetSum === 0) return true;
        if(targetSum < 0) return false;
    
        for(let num of numbers) {
            const remainder = targetSum - num
            if(canSum(remainder, numbers)) {
                return true
            }
        }
    
        return false;
    }
    

    Can Sum

    Memoization

    const canSumMemo = (targetSum, numbers, memo = {}) => {
        if(targetSum in memo) return memo[targetSum];
    
        if(targetSum === 0) return true;
        if(targetSum < 0) return false;
    
        // for each number, we subtract it from the target sum and check if it is possible to get the remainder.
        for(let num of numbers) {
            const remainder = targetSum - num;
            memo[targetSum] = canSumMemo(remainder, numbers, memo)
            if(memo[targetSum]) {
                return memo[targetSum]
            }
        }
    
        memo[targetSum] = false;
        return memo[targetSum];
    }
    

    Can Sum Memo

    Tabulation

    const canSumTab = (targetSum, numbers) => {
        const table = new Array(targetSum + 1).fill(false)
        table[0] = true
    
        for(let i = 0; i <= targetSum; i++) {
            // if current position is true, then the num later position is also true
            if(table[i] === true) {
                for(let num of numbers) {
                    table[i + num] = true;
                }
            }
        }
    
        return table[targetSum]
    }
    

    Reference