背包问题解题思路

背包问题解题思路

常见的背包问题有

1、组合问题

377. 组合总和 Ⅳ

494. 目标和

518. 零钱兑换 II

公式: d p [ i ] + = d p [ i − n u m ] dp[i] += dp[i-num] dp[i]+=dp[inum]

2、True、False问题

139. 单词拆分

416. 分割等和子集

公式: d p [ i ] = d p [ i ] o r d p [ i − n u m ] dp[i] = dp[i] or dp[i-num] dp[i]=dp[i]ordp[inum]

3、最大最小问题

474. 一和零

322. 零钱兑换

公式: d p [ i ] = m i n ( d p [ i ] , d p [ i − n u m ] + 1 ) o r d p [ i ] = m a x ( d p [ i ] , d p [ i − n u m ] + 1 ) dp[i] = min(dp[i], dp[i-num]+1) or dp[i] = max(dp[i], dp[i-num]+1) dp[i]=min(dp[i],dp[inum]+1)ordp[i]=max(dp[i],dp[inum]+1)

解题步骤

  • 分析是否为背包问题。
  • 是以上三种背包问题中的哪一种。
  • 是0-1背包问题还是完全背包问题。也就是题目给的nums数组中的元素是否可以重复使用。
  • 如果是组合问题,是否需要考虑元素之间的顺序。需要考虑顺序有顺序的解法,不需要考虑顺序又有对应的解法。

背包问题的判定
背包问题具备的特征:给定一个targettarget可以是数字也可以是字符串,再给定一个数组numsnums中装的可能是数字,也可能是字符串,

问:能否使用nums中的元素做各种排列组合得到target

背包问题技巧

  • 如果是0-1背包,即数组中的元素不可重复使用,nums放在外循环,target在内循环,且内循环倒序;
for num in nums:
    for i in range(target, nums-1, -1):
  • 如果是完全背包,即数组中的元素可重复使用,nums放在外循环,target在内循环。且内循环正序。
for num in nums:
    for i in range(nums, target+1):
  • 如果组合问题需考虑元素之间的顺序,需将target放在外循环,将nums放在内循环。
for i in range(1, target+1):
    for num in nums:

参考链接

  1. 希望用一种规律搞定背包问题
  2. leetcode题解-动态规划
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值