diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 599a3180..415ff88b 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -227,6 +227,45 @@ class Solution: ``` Go: +``` +func canPartition(nums []int) bool { + /** + 动态五部曲: + 1.确定dp数组和下标含义 + 2.确定递推公式 + 3.dp数组初始化 + 4.dp遍历顺序 + 5.打印 + **/ + //确定和 + var sum int + for _,v:=range nums{ + sum+=v + } + if sum%2!=0{ //如果和为奇数,则不可能分成两个相等的数组 + return false + } + sum/=2 + //确定dp数组和下标含义 + var dp [][]bool //dp[i][j] 表示: 前i个石头是否总和不大于J + //初始化数组 + dp=make([][]bool,len(nums)+1) + for i,_:=range dp{ + dp[i]=make([]bool,sum+1) + dp[i][0]=true + } + for i:=1;i<=len(nums);i++{ + for j:=1;j<=sum;j++{//j是固定总量 + if j>=nums[i-1]{//如果容量够用则可放入背包 + dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]] + }else{//如果容量不够用则不拿,维持前一个状态 + dp[i][j]=dp[i-1][j] + } + } + } + return dp[len(nums)][sum] +} +``` javaScript: