- 零錢兌換
如果求組合數就是外層for迴圈遍歷物品,內層for遍歷揹包。
如果求排列數就是外層for遍歷揹包,內層for迴圈遍歷物品。
這句話結合本題 大家要好好理解。
影片講解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.零錢兌換.html
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
const dp = new Array(amount+1).fill(Infinity);
dp[0] = 0;
for (let i=0;i<coins.length;i++) {
for (let j=coins[i];j<=amount;j++) {
dp[j] = Math.min(dp[j], dp[j-coins[i]]+1);
}
}
return dp[amount]===Infinity? -1:dp[amount];
};
279.完全平方數
本題 和 322. 零錢兌換 基本是一樣的,大家先自己嘗試做一做
影片講解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.完全平方數.html
/**
* @param {number} n
* @return {number}
*/
var numSquares = function(n) {
const dp = new Array(n+1).fill(Infinity);
dp[0] = 0;
for (let i=0;i*i<=n;i++) {
for (let j=i*i;j<=n;j++) {
dp[j] = Math.min(dp[j-i*i]+1,dp[j]);
}
}
return dp[n];
};
139.單詞拆分
影片講解:https://www.bilibili.com/video/BV1pd4y147Rh
https://programmercarl.com/0139.單詞拆分.html
這題先複製題解,沒時間了
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
let dp = Array(s.length + 1).fill(false);
dp[0] = true;
for(let i = 0; i <= s.length; i++){
for(let j = 0; j < wordDict.length; j++) {
if(i >= wordDict[j].length) {
if(s.slice(i - wordDict[j].length, i) === wordDict[j] && dp[i - wordDict[j].length]) {
dp[i] = true
}
}
}
}
return dp[s.length];
};
關於多重揹包,你該瞭解這些!
https://programmercarl.com/揹包問題理論基礎多重揹包.html
揹包問題總結篇!
https://programmercarl.com/揹包總結篇.html