完全背包值-279. 完全平方数-322. 零钱兑换

58 阅读2分钟

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

 

示例 1:

输入: n = 12
输出: 3 
解释: 12 = 4 + 4 + 4

示例 2:

输入: n = 13
输出: 2
解释: 13 = 4 + 9
  1. 这个题目,第一个难点怎么确认背包数量
  2. 你如何去初始化数组,实际上,每个相里面,最坏情况实际上是由当前容量数个1来决定。
  3. 其次,里面当选择了i物品,为何不是i-1,这个其实是优化后的,因为正常其实还是需要对之前的状态,一直进行一个累加,直接为dp[i][j-nums[i]] 是优化后的
/**
 * @param {number} n
 * @return {number}
 */
var numSquares = function (n) {
    let m = Math.floor(Math.sqrt(n))
    let dp = new Array(m + 1).fill(Infinity).map(() => new Array(n + 1).fill(Infinity));

    for (let i = 0; i < dp.length; i++) {
        for (let j = 0; j < dp[i].length; j++) {
            dp[i][j] = j;
        }
    }

    for (let i = 1; i <= m; i++) {
        for (let j = 0; j <= n; j++) {
            if (j >= i * i) {

                for (let k = 1; k * i * i <= n; k++) {
                    if (j >= k * i * i) {
                        dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - k * i * i] + k)
                    }

                }

            } else {
                dp[i][j] = dp[i - 1][j]
            }

        }


    }


    return dp[m][n]

};

322. 零钱兑换

labuladong 题解思路

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function(coins, amount) {
    let dp = new Array(coins.length+1).fill(Infinity).map(()=>new Array(amount+1).fill(Infinity));
 

    for(let i = 0;i<=coins.length;i++){
        dp[i][0] = 0
    }

    for(let i = 1;i<=coins.length;i++){
        for(let j = 0;j<=amount;j++){
            if(j >=coins[i-1]){
                // 这里注意是i 而不是 i -1 同时加1代表了 第i个硬币加入的个数
                dp[i][j] = Math.min(dp[i-1][j],dp[i][j-coins[i-1]]+1)
            }else {
                dp[i][j] = dp[i-1][j]
            }
  
        }
    }


    return dp[coins.length][amount] === Infinity ? -1 : dp[coins.length][amount] 

};