力扣完全背包总结

1,求组合(每增加一个元素,需要叠加之前的状态:dp[j]+=dp[j-w])累加需要初始化dp[0]=1

例题:

518,零钱兑换 II:给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

无限个,完全背包(区别在于遍历,背包容量由小到大,初始化为w[i])

求组合数:dp[i]+=dp[i-w[i]]   累加需要初始化dp[0]=1

求个数(要还是不要):dp[j]=max(dp[j],dp[j-w[i]]+1)

494. 目标和  :给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

正数的总和-(sum-正数的总和)=目标数     负数的总和=sum-正数的总和

正总和=(sum+s)/2

所以要求正数的总和(的组合数)

求组合(每增加一个元素,需要叠加之前的状态:dp[j]+=dp[j-w])

累加需要初始化dp[0]=1

2,求个数(要还是不要):dp[j]=max(dp[j],dp[j-w[i]]+1)

求最小数,初始值赋最大值Infinity

求最大数,初始值赋值0

例题:

322,零钱兑换: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

求个数;dp[j]=min(dp[j],dp[j-n[i]]+1)

首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;

其他下标对应的数值呢?

考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。

所以下标非0的元素都是应该是最大值。

 279.完全平方数:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

求个数;dp[j]=min(dp[j],dp[j-n[i]]+1)

求最小数,初始值赋最大值Infinity

3,是否注重排列顺序,

不考虑顺序(先遍历物品)

考虑顺序(先遍历背包容量,且需要判断每次加入的物品的重量是否可以放入背包)

377,组合总和 Ⅳ :给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数组合的个数。顺序不同的序列被视作不同的组合。

需要注意顺序,则先遍历背包(背包初始化为0,则每次加入需要判断是否装得下)

Dp为组合数  dp[j]+=dp[j-w[i]]

 

70,爬楼梯  :每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

求几种方法,组合dp[j]+=dp[j-n[i]]   需要考虑顺序,先遍历背包(需要判断是否装得下)

创建物品列表nums=[1,2]

以上全部题目的具体代码都在本专栏里记录了,可以查找

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值