代码随想录算法训练营第43天 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

一、Leetcode 1049. 最后一块石头的重量 II

这几个题都很不好给转成01问题。本题一开始我以为怎么撞都行,其实不是,相当于给每项前面加±1,
在这里插入图片描述
就是说有时候不能浪费小石头,得跟大石头碰。
那么问题就很明显了,类似于分割等和子集。变成01背包问题。然后背包容量是sum的一半。
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
dp初始化大小题目给了,默认0;

二、Leetcode 494. 目标和

如何转化为01背包问题呢。假设加法的总和为x,那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) = target, x = (target + sum) / 2.
此时问题就转化为,装满容量为x背包,有几种方法。
组合问题递推公式 dp[j] += dp[j - nums[i]]
初始化 dp[0] 为 1。

三、Leetcode 474.一和零

确定dp数组(dp table)以及下标的含义
dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

你可能感兴趣的:(刷题,算法,动态规划,leetcode)