RMT的动态规划笔记

这篇博客是关于动态规划的笔记,涵盖了选数凑和问题和选硬币凑钱问题的解题思路,通过递归和动态规划的方法解决。还介绍了矩阵网格问题、coin change问题、unique paths问题和jump game的存在题,详细阐述了动态规划的特点、解题步骤,包括确定状态、转移方程、初始条件和边界情况以及计算顺序。
摘要由CSDN通过智能技术生成

笔记1

笔记对应b站视频BV1bb411t7FK

1. 选数凑和问题

题目

有若干个数,从中选取一些数使得总和最大,要求是不可以选取相邻的数,问应当怎样选?

思路

采用递归思想,当有i个数时,有两种选法,如果选择了第i个数,那么就不能选择第i-1个数,下一步就只能从第i-2个数及以前选择。但是如果不选第i个数,下一步就可以选第i-1个数,也就是将问题转化成了有i-1个数时的情况。由此,便可以按照递归的方式进行解题。

def find_max_sum(n_list):
	if len(n_list) == 1:
		return n_list[0]
	if len(n_list) == 2:
		return max(*n_list)
	return max(find_max_sum(n_list[:-1]), n_list[-1]+find_max_sum(n_list[:-2]))

2.选硬币凑钱问题

题目

有若干种面值的硬币,按照面值由小到大排列。现在给出一个金额,不限制每种硬币拿取的数量,问怎样拿硬币,使得硬币的个数最少,而能够刚好达到需要的金额?

思路

这个问题相当于先拿取一枚某一种面值的硬币,然后需要达到的金额就变成了总金额减去这枚硬币的金额,从而变成了一个子问题,可以用递归解决。以下是一个例子。

coins = [1,3,5]

def find(total):
	if total < 0:
		return 9999
	if total == 0:
		return 0
	if total == 1:
		return 1
	return min(find(total-1)+1, find(total-3)+1, find(total-5)+1)


print(find(23))

笔记2

对应B站视频BV1xb411e7ww

引言:矩阵网格问题

给定一个矩阵网格,一个机器人从左上角出发,每次可以向下或向右走一步,有多少种方式走到右下角?输出所有走到右下角的路径。

其中前一个问题应当使用动态规划,后一个问题使用递归来做(DFS)。

动态规划题目特点

1、计数题
有多少种方式走到右下角
有多少种方法选出k个数使得和是sum

2、最值题
从左下角走到右上角路径的最大数字和
最长上升子序列长度

3、存在题
取石子游戏,先手是否必胜
能不能选出K个数使得和是sum

最值题:coin change问题

有三种硬币,2元、5元、7元,每种硬币都有足够多,用最少的硬币数凑出某个金额(如27)
看到“最少”字样,想到动态规划

解题:

1. 确定状态

状态在动态规划中的作用是定海神针,解题的时候需要开一个数组,数组的每个元素代表什么?(类似于设未知量)
确定状态需要两个意识:

最后一步:如,除去最后一枚硬币,剩余的硬币面值的总和一定是 s u m − a k sum-a_k sumak

  • 不关心前面的k-1枚硬币是怎么拼的,但确定面值的总和
  • 前面的硬币数一定要最少,一定是最少的

子问题:现在的问题转化成了最少用多少枚硬币拼出 s u m − a k sum-a_k sumak的面值,这个问题与原问题类似,但是规模更小,这就叫子问题。

假定最优类的问题,只要找到最优子问题,就可以使用动态规划去尝试解题。

定义问题f,f(X)表示凑出面值X的最少硬币数,则有:

f(27) = min(f(27-2)+1, f(27-5)+1, f(27-7)+1)

首先,用递归来解题:

def f(X):
    if X == 0:
        return 0  # 0元钱只需要0枚硬币
    res = float('inf')  # 初始化使用无穷大, 同时暗含了负数与1的情况
    if X >= 2:
        res = min(f(X 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值