查看: 1419| 回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

[动态规划] 一道题求解惑

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 JoyForce 于 2021-1-1 18:21 编辑

leetcode 416
我用两种解法都能ac,能写出两种解法完全不是因为融会贯通和举一反三,而是因为看其他的01背包问题的解题方法,这两种都出现过,但其实自己并不能理解为什么两种方法都行。
说实话解法一我倒能理解一点,因为可以根据一个没有mem优化的解法推演出来,解法二就完全弄不明白了

解法一:
  1. public class Solution
  2.     {
  3.         public bool CanPartition(int[] nums)
  4.         {
  5.             var sum = nums.Sum();
  6.             if (sum % 2 > 0)
  7.             {
  8.                 return false;
  9.             }

  10.             var target = sum / 2;
  11.             var dp = new bool[target + 1];
  12.             dp[0] = true;
  13.             for (var i = 0; i < nums.Length; ++i)
  14.             {
  15.                 for (var j = nums[i]; j <= target; ++j)
  16.                 {
  17.                     if (dp[j - nums[i]])
  18.                     {
  19.                         dp[j] = true;
  20.                     }
  21.                 }
  22.             }

  23.             return dp[target];
  24.         }
  25.     }
复制代码


解法二:
  1. public class Solution
  2.     {
  3.         public bool CanPartition(int[] nums)
  4.         {
  5.             var sum = nums.Sum();
  6.             if (sum % 2 > 0)
  7.             {
  8.                 return false;
  9.             }

  10.             var target = sum / 2;
  11.             var dp = new bool[target + 1];
  12.             dp[0] = true;
  13.             for (var i = nums.Length - 1; i >= 0; --i)
  14.             {
  15.                 for (var j = target; j >= nums[i]; --j)
  16.                 {
  17.                     dp[j] = dp[j] || dp[j - nums];[i][i]
  18.                 }
  19.             }

  20.             return dp[target];
  21.         }
  22.     }
复制代码


[/i][/i][/i][/i]

补充内容 (2021-1-1 19:45):
感谢大神的解答,我解法一copy了一个之前错误的解法,解法二才是正解
第一种是完全背包问题,第二种是01背包问题
另外,还有多重背包问题

评分

参与人数 2大米 +4 收起 理由
14417335 + 3
不知道小帅 + 1 赞一个

查看全部评分


上一篇:力扣有题千余道,我日夜刷之, 所谓乎?无所谓也.
下一篇:222的終極解法,求時間複雜度
推荐
 楼主| JoyForce 2021-1-2 12:04:21 | 只看该作者
全局:
luke77gu 发表于 2021-1-1 19:58
第一个是从小到大推dp公式,第二种是从target减小到nums,两种看上去都很合理啊。

还是不一样的
解法一,是完全背包问题,也就是每个物品数量没有限制
解法二,是01背包问题,每个物品最多一个
可以看看这个blog:https://blog.csdn.net/wzy_1988/article/details/12260343
回复

使用道具 举报

全局:
不知道你用的什么语言,有点像Java,但是又不是。第一种写法应该对应的是完全背包问题,这个题目应该是过不了的。第二种写法对应的才是0-1背包问题。
回复

使用道具 举报

🔗
 楼主| JoyForce 2021-1-2 11:20:28 来自APP | 只看该作者
全局:
不知道小帅 发表于 2021-01-01 18:47:11
不知道你用的什么语言,有点像Java,但是又不是。第一种写法应该对应的是完全背包问题,这个题目应该是过不了的。第二种写法对应的才是0-1背包问题。
语言是c#,两种都过了
回复

使用道具 举报

全局:
JoyForce 发表于 2021-1-2 11:20
语言是c#,两种都过了

【1, 2, 5】这个情况的话,第一个应该是return true啊,实际应该是false吧

评分

参与人数 1大米 +1 收起 理由
我想要offer真的 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
 楼主| JoyForce 2021-1-2 11:42:47 | 只看该作者
全局:
不知道小帅 发表于 2021-1-1 19:27
【1, 2, 5】这个情况的话,第一个应该是return true啊,实际应该是false吧

哦哦,我解法一 copy 错了,又仔细看了一下两种解法是一模一样的。。谢谢解答
01背包和完全背包的解法太相似了,是不是差别只有内层循环的遍历顺序不一样?
回复

使用道具 举报

全局:
JoyForce 发表于 2021-01-01 19:42:47
哦哦,我解法一 copy 错了,又仔细看了一下两种解法是一模一样的。。谢谢解答
01背包和完全背包的解法太相似了,是不是差别只有内层循环的遍历顺序不一样?
是的,01内层循环从大到小,完全背包从小到大。其实是从二维的dp转移方程优化过来的。

评分

参与人数 1大米 +1 收起 理由
JoyForce + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
luke77gu 2021-1-2 11:58:57 | 只看该作者
全局:
第一个是从小到大推dp公式,第二种是从target减小到nums[i],两种看上去都很合理啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表