- 最後一塊石頭的重量 II
本題就和 昨天的 416. 分割等和子集 很像了,可以嘗試先自己思考做一做。
影片講解:https://www.bilibili.com/video/BV14M411C7oV
https://programmercarl.com/1049.最後一塊石頭的重量II.html
這三體=題都沒啥思路
/**
* @param {number[]} stones
* @return {number}
*/
var lastStoneWeightII = function(stones) {
let sum = 0;
for (let i=0;i<stones.length;i++) {
sum+=stones[i];
}
let target = Math.floor(sum/2);
const dp = new Array(target+1).fill(0);
for (let i=0;i<stones.length;i++) {
for (let j=target;j>=stones[i];j--) {
dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
return sum-dp[target] - dp[target];
};
- 目標和
大家重點理解 遞推公式:dp[j] += dp[j - nums[i]],這個公式後面的提問 我們還會用到。
影片講解:https://www.bilibili.com/video/BV1o8411j73x
https://programmercarl.com/0494.目標和.html
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var findTargetSumWays = function(nums, target) {
let sum = 0;
for (let i=0;i<nums.length;i++) {
sum+=nums[i];
}
if (Math.abs(target)>sum) {
return 0;
}
if ((sum+target)%2===1) {
return 0;
}
let left = (sum+target)/2;
const dp = new Array(left+1).fill(0);
dp[0] = 1;
for (let i=0;i<nums.length;i++) {
for (let j=left;j>=nums[i];j--) {
dp[j] += dp[j-nums[i]];
}
}
return dp[left];
};
474.一和零
透過這道題目,大家先粗略瞭解, 01揹包,完全揹包,多重揹包的區別,不過不用細扣,因為後面 對於 完全揹包,多重揹包 還有單獨講解。
影片講解:https://www.bilibili.com/video/BV1rW4y1x7ZQ
https://programmercarl.com/0474.一和零.html
/**
* @param {string[]} strs
* @param {number} m
* @param {number} n
* @return {number}
*/
var findMaxForm = function(strs, m, n) {
const dp = new Array(m+1).fill(0).map(()=>new Array(n+1).fill(0));
for (let str of strs) {
let x = 0;
let y = 0;
for (let k=0;k<str.length;k++) {
if (str[k] === '0'){
x++;
} else {
y++;
}
}
for (let i=m;i>=x;i--) {
for(let j=n;j>=y;j--) {
dp[i][j] = Math.max(dp[i][j], dp[i-x][j-y]+1);
}
}
}
return dp[m][n];
};