代码随想录算法训练营第四十二/三天 | 动态规划(背包问题)

动态规划(背包问题)

题目

416. 分割等和子集
1049. 最后一块石头的重量 II
494. 目标和
474.一和零

对题目的想法

  1. 01背包已经看懂了,理论上这几道题应该是01背包的变种,然后一开始根本看不出来这些。
  2. 01背包所用的例子里面重量数组恰好是排序的,误以为每次应用背包问题都要先排序,后来才意识到并不需要。

实现中/后的感想、看完代码随想录之后的想法

  • 分割等和子集:
    1. 机械性得想套用01背包的模型,发现找不到weight和value。看了题解才知道这种情况下weight = value。
    2. 所以这道题确实是非常标准的01背包题目。
  • 最后一块石头的重量 II:
    1. 一开始想用类似贪心的算法,dp[i] = min(abs(dp[i - 1] + stones[i]), abs(dp[i - 1] - stones[i]))但是行不通。
    2. 直接看题解,然后发现此时依然是weight = value。
  • 目标和:
    1. 头疼点在于要求的是物品数量的总和,而不是最大的weight或者最大的value。此时试图用额外的计数器,每当dp[bagweight] == target时就让计数器加一,不过思路很混乱。
    2. 题解实际上看得有点晕,虽然记住了但是应该没有彻底理解,不如另外几道题印象深刻。
  • 一和零:
    1. 下意识先把每个String都变成一个长度为二的数组,虽然后来看题解之后发现没有必要。
    2. 这一题的关键在于背包的重量有两个维度,所以需要改写for循环中遍历重量的一条:
    for ( 每个元素/物品 ) {
    	for ( 从最大重量 到当前物品的重量 ){
    		dp数组的更新;
    	}
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值