当前位置: 首页 > news >正文

代码随想录算法训练营第37天|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

打卡Day37

  • 1.完全背包理论基础
  • 2.518.零钱兑换II
  • 3.377. 组合总和 Ⅳ
  • 4.70. 爬楼梯(进阶版)

1.完全背包理论基础

题目链接:完全背包理论基础
文档讲解: 代码随想录

01背包和完全背包的区别:
01背包中每个物品只能使用一次,而完全背包中可以重复使用,每种物品有无数件。
这点不同会体现在遍历顺序上,直接针对遍历顺序进行分析。01背包的内部循环遍历背包容量时是从后往前的,为了确保每个物品只被加入一次。而在纯完全背包问题中,这个内部循环是从前往后的,因为每个物品可以重复使用。同时,对于纯完全背包问题,可以先遍历物品后背包,也可以先背包后物品。因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。而对于01背包问题,如果两层循环对调,每个dp[j]只能放入一个物品。

kind, bagweight = [int(x) for x in input().split()]
weight = []
value = []
for _ in range(kind):a, b = [int(x) for x in input().split()]weight.append(a)value.append(b)dp = [0] * (bagweight + 1)
for i in range(kind):for j in range(weight[i], bagweight + 1):dp[j] = max(dp[j], dp[j - weight[i]] + value[i])print(dp[bagweight])

2.518.零钱兑换II

题目链接:518.零钱兑换II
文档讲解: 代码随想录

(1)确定数组和下标
这道题硬币的重量和价值相等,总金额 j 可以抽象为容量为 j 的背包装满的价值为 j。所求的是装满背包的方法数量。dp[ j ] 表示背包容量为 j 装满的方法数。
(2)递推关系式
遍历到 coins[ i ] 时,dp[ j ] += dp[j - coins[i]]
(3)初始化
dp[0] = 1,不然往后递推都为0
(4)遍历顺序
先物品后背包
(5)打印数组

class Solution(object):def change(self, amount, coins):""":type amount: int:type coins: List[int]:rtype: int"""dp = [0] * (amount + 1)dp[0] = 1for i in range(len(coins)):for j in range(coins[i], amount + 1):dp[j] += dp[j - coins[i]]return dp[amount]

我忽略的一个点是在遍历顺序上的细节,这道题中求的是组合数,而不是排列数,这两种情况的遍历顺序是不一样的。例如,coins[0] = 1, coins[1] = 5。先遍历物品后背包求的是组合数,先放入1进行计算,在放入5进行计算。而先背包后物品是排列数,因为每次外层的背包循环,都会经过1和5的计算,会包含{1,5}和{5,1}两种情况。

3.377. 组合总和 Ⅳ

题目链接:377. 组合总和 Ⅳ
文档讲解: 代码随想录

(1)确定数组和下标
dp[ j ]表示和为 j 的组合个数
(2)递推关系式
dp[ j ] += dp[ j - nums[ i ] ]
(3)初始化
sp[0] = 1,为0后续递推都为0
(4)遍历顺序
因为顺序不同的序列被视为不同的组合,因此时排列问题,先背包后物品,均从前往后遍历
(5)打印数组

class Solution(object):def combinationSum4(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""dp = [0] * (target + 1)dp[0] = 1for j in range(1, target + 1):for i in range(len(nums)):if j >= nums[i]:dp[j] += dp[j - nums[i]]return dp[target]

4.70. 爬楼梯(进阶版)

题目链接:70. 爬楼梯(进阶版)
文档讲解: 代码随想录

(1)确定数组和下标
dp[ j ] 表示爬 j 个台阶的方法数
(2)递推关系式
dp[ j ] += dp[ j - i ]
(3)初始化
dp[0] = 1,其余位置为0,因为要做累加
(4)遍历顺序
排列问题,先背包后物品,都从前往后
(5)打印数组

n, m = [int(x) for x in input().split()]
dp = [0] * (n + 1)
dp[0] = 1
for j in range(1, n + 1):for i in range(1, m + 1):if j >= i:dp[j] += dp[j - i]
print(dp[n])

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】深度学习基本概念、工作原理及实际应用案例
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • 微信小程序之behaviors
  • 刷题——不同路径的数目
  • Python基础学习笔记(一)
  • 记录一次网站疑似被劫持的排查
  • 数据治理五部曲
  • uniapp中初始化对象不赋值,后续属性无法绑定问题
  • 掌握SQL Server事务日志的艺术:深入配置与管理
  • Spock Unit Test in Java
  • c++ 11 =delete
  • 数据结构(面试)
  • Java:类和对象
  • c++网络编程实战——开发基于协议的文件传输模块(一)如何实现一个简单的tcp长连接
  • vulnhub靶机:Tomato
  • conda常用的命令
  • Java深入 - 深入理解Java集合
  • python学习笔记 - ThreadLocal
  • 动态规划入门(以爬楼梯为例)
  • 前端
  • 如何用vue打造一个移动端音乐播放器
  • 入门级的git使用指北
  • 数据可视化之 Sankey 桑基图的实现
  • 小程序开发之路(一)
  • 用简单代码看卷积组块发展
  • 怎样选择前端框架
  • MyCAT水平分库
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​什么是bug?bug的源头在哪里?
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Oracle)SQL优化技巧(一):分页查询
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (分类)KNN算法- 参数调优
  • (黑马点评)二、短信登录功能实现
  • (南京观海微电子)——COF介绍
  • (三)模仿学习-Action数据的模仿
  • (四)JPA - JQPL 实现增删改查
  • (一)VirtualBox安装增强功能
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core + vue 搭建前后端分离的框架
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net Core 中间件验签
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /etc/skel 目录作用
  • @font-face 用字体画图标
  • @软考考生,这份软考高分攻略你须知道
  • [ C++ ] 继承
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解