代码随想录算法训练营|day42

第九章 动态规划

背包类型 求解方法
0/1背包 外循环nums,内循环target,target倒序且target>=nums[i]
完全背包 外循环nums,内循环target,target正序且target>=nums[i]
组合背包 外循环target,内循环nums,target正序且target>=nums[i]

416.分割等和子集

该问题转换为在数组中找到元素和target=sum(nums)/2即可,为0/1背包问题,dp[i]表示是否存在子集和为i。

初始化:dp[0]=true,表示和为0,不需要选取任何元素,为真

如果和为奇数或者数组中最大值大于target无法分成两个等和子集

go 复制代码
func canPartition(nums []int) bool {
	sum, maxNum := 0, 0
	for _, num := range nums {
		maxNum = max(maxNum, num)
		sum += num
	}
	if sum%2 != 0 {
		return false
	}
	target := sum / 2
	if maxNum > target {
		return false
	}
	dp := make([]bool, target + 1)
	dp[0] = true
	for _, num := range nums {
		for i := target; i >= num; i-- {
			dp[i] = dp[i] || dp[i - num]
		}
	}
	return dp[target]
}

代码随想录文章详解

01背包理论基础
01背包理论基础(滚动数组)
416.分割等和子集

相关推荐
biter down18 分钟前
C++ 解决海量数据 TopK 问题:小根堆高效解法
c++·算法
用户66006766853920 分钟前
斐波那契数列:从递归到缓存优化的极致拆解
前端·javascript·算法
初夏睡觉26 分钟前
P1055 [NOIP 2008 普及组] ISBN 号码
算法·p1055
程芯带你刷C语言简单算法题30 分钟前
Day28~实现strlen、strcpy、strncpy、strcat、strncat
c语言·c++·算法·c
踏浪无痕42 分钟前
周末拆解:QLExpress 如何做到不编译就能执行?
后端·算法·架构
一个不知名程序员www44 分钟前
算法学习入门--- 树(C++)
c++·算法
如竟没有火炬1 小时前
四数相加贰——哈希表
数据结构·python·算法·leetcode·散列表
半桶水专家1 小时前
GORM 结构体字段标签(Struct Tags)详解
golang·go·gorm
背心2块钱包邮1 小时前
第9节——部分分式积分(Partial Fraction Decomposition)
人工智能·python·算法·机器学习·matplotlib
仰泳的熊猫1 小时前
1148 Werewolf - Simple Version
数据结构·c++·算法·pat考试