func canPartition(nums []int) bool {
//将问题转化为背包问题求解
//1、求元素之和
sum := 0
for _, v := range nums {
sum += v
}
//如果元素之和为奇数则返回fasle
if sum%2 == 1 {
return false
}
//2、求背包容量
weight := sum / 2
//3、确定dp数组含义,表示背包容量为j时可以装的最大价值(本题物品重量和价值相同)
//并初始化dp数组为全0
dp := make([]int, weight+1)
//4、遍历顺序为先遍历物品再遍历背包,背包倒序遍历
for i := 0; i < len(nums); i++ {
for j := weight; j >= nums[i]; j-- {
dp[j] = max(dp[j], dp[j-nums[i]]+nums[i])
}
}
return dp[weight]==weight
}
func max(a,b int) int {
if a > b {
return a
}
return b
}