代码随想录算法训练营第三十三天 | 322. 零钱兑换 279.完全平方数 139.单词拆分

无论排列还是组合,元素个数是一样的。

背包问题中 dpj 的含义都是装满容量为 j 的背包,所以如果装不满,dpj还是初始值。

Go 复制代码
import "math"

func coinChange(coins []int, amount int) int {
	dp := make([]int, amount+1)
	dp[0] = 0
	for i := 1; i <= amount; i++ {
		dp[i] = math.MaxInt32
	}
	for _, coin := range coins {
		for j := coin; j <= amount; j++ {
			dp[j] = min(dp[j], dp[j-coin]+1)
		}
	}
	if dp[amount] == math.MaxInt32 {
		return -1
	}
	return dp[amount]
}

本题 和 322. 零钱兑换 基本是一样的

Go 复制代码
func numSquares(n int) int {
	dp := make([]int, n+1)
	dp[0] = 0
	for i := 1; i <= n; i++ {
		dp[i] = n + 1
	}
	for i := 1; i*i <= n; i++ {
		for j := i * i; j <= n; j++ {
			dp[j] = min(dp[j], dp[j-i*i]+1)
		}
	}
	return dp[n]
}
  1. 也可以算作回溯算法中的分割问题,再用记忆化递归优化。
  2. 前面的题要么是标准背包(求max价值),要么是多少种方法,要么是最少的物品个数。本题的状态转移方程就很灵活,也可以不理解成背包问题,只是一个普通的动态规划问题。
  3. s是物品的排列,所以要先遍历背包。

视频为什么说 可以不理解成背包问题,我认为是代码没有体现出来,如果按我这样写就是很明显的背包问题代码;答案代码也很好,只是没明显体现出是背包问题。

Go 复制代码
func wordBreak(s string, wordDict []string) bool {
	dp := make([]bool, len(s)+1)
	dp[0] = true
	for j := 1; j <= len(s); j++ {
		for _, word := range wordDict {
			if j >= len(word) {
				if dp[j-len(word)] && s[j-len(word):j] == word {
					dp[j] = true
					break
				}
			}
		}
	}
	return dp[len(s)]
}

其中状态转移方程是

Go 复制代码
				if dp[j-len(word)] && s[j-len(word):j] == word {
					dp[j] = true
					break
				}

和答案代码最主要的差别就是遍历了物品(word)而不是s中的下标 i

相关推荐
leisoo80971 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17683 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴4 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆4 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng4 小时前
2024牛客暑期多校训练营1
算法
hetao17338374 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑4 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
疯狂打码的少年5 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6665 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance5 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型