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

73 阅读1分钟

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

474. 一和零

题目链接:474. 一和零

  • 这里因为0和1的数量不同,所以dp数组的重量由两个数表示,二维数组
  • 接着就是套公式

494. 目标和 (与分割等和子集有点像)

题目链接:494. 目标和

  • 综上,可以推出 sum(A) = (target + sum(nums)) / 2,也就是把原问题转化成:nums 中存在几个子集 A,使得 A 中元素的和为 (target + sum(nums)) / 2
  • 给一个容量,问有多少种方式能把背包装满
  • dp[j]:装满容量为j的背包有dp[j]种方法
  • 比如说已经有了一个2,还需要dp[3]种方法可以
  • 递推公式:dp[j] = dp[j - nums[j]]
  • 初始化: dp[0] = 1
  • 求多少种方法都是这个递推公式

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

题目链接:1049. 最后一块石头的重量 II

  • 和分割等和子集类似,因为这里的石头的重量和价值是等价的,求最大价值就是试图将背包填满
  • dp数组长度为sum/2
  • 可以用移位运算符来进行除二操作