Skip to content

📚 10.最后一块石头的重量 II

💻 代码实现

typescript
/**
 * @url https://leetcode.cn/problems/last-stone-weight-ii/description/
 */

// TODO:如何将问题抽象成01背包问题?

// 要使最后一块石头的重量尽可能地小,neg 需要在不超过 ⌊sum/2⌋ 的前提下尽可能地大。因此本问题可以看作是背包容量为 ⌊sum/2⌋,物品重量和价值均为 stones

// function lastStoneWeightII(stones: number[]): number {
//     const sum = stones.reduce((acc, cur) => acc + cur, 0)
//     const target = Math.floor(sum / 2)
//     const dp = new Array(stones.length).fill(0).map((_arr) => new Array(target + 1).fill(0))
//     for (let i = 0; i < stones.length; i++) {
//         dp[i][0] = 0
//     }
//     for (let j = 0; j <= target; j++) {
//         if (j >= stones[0]) {
//             dp[0][j] = stones[0]
//         } else {
//             dp[0][j] = 0
//         }
//     }

//     for (let row = 1; row < stones.length; row++) {
//         for (let col = 1; col <= target; col++) {
//             if (col - stones[row] >= 0) {
//                 dp[row][col] = Math.max(dp[row - 1][col], dp[row - 1][col - stones[row]] + stones[row])
//             } else {
//                 dp[row][col] = dp[row - 1][col]
//             }
//         }
//     }
//     return Math.abs(sum - dp[stones.length - 1][target] - dp[stones.length - 1][target])
// }

// notice:抽离成一维数组
function lastStoneWeightII(stones: number[]): number {
  const sum = stones.reduce((acc, cur) => acc + cur, 0);
  const target = Math.floor(sum / 2);

  const dp: number[] = new Array(target + 1).fill(0);
  dp[0] = 0;

  for (let row = 0; row < stones.length; row++) {
    console.dir(dp);

    for (let col = target; col >= stones[row]; col--) {
      dp[col] = Math.max(dp[col - stones[row]] + stones[row], dp[col]);
    }
  }

  console.dir(dp);
  return Math.abs(sum - dp[target] - dp[target]);
}

lastStoneWeightII([2, 7, 4, 1, 8, 1]);

Released under the MIT License.