package DP
//func canPartition(nums []int) bool {
// size := len(nums)
// sum := 0
// for i := 0; i < size; i++ {
// sum += nums[i]
// }
// if sum%2 != 0 {
// return false
// }
// target := sum / 2
// var f func(int, int) bool
// f = func(index, rest int) bool {
// if index == size {
// return rest == 0
// }
// ret1 := f(index+1, rest)
// ret2 := false
// if rest >= nums[index] {
// ret2 = f(index+1, rest-nums[index])
// }
// return ret1 || ret2
// }
// return f(0, target)
//}
func canPartition(nums []int) bool {
size := len(nums)
sum := 0
for i := 0; i < size; i++ {
sum += nums[i]
}
if sum%2 != 0 {
return false
}
target := sum / 2
dp := make([][]bool, size+1)
for i := 0; i <= size; i++ {
dp[i] = make([]bool, target+1)
}
dp[size][0] = true
for i := size - 1; i >= 0; i-- {
for j := 0; j <= target; j++ {
dp[i][j] = dp[i+1][j]
if j >= nums[i] {
dp[i][j] = dp[i][j] || dp[i+1][j-nums[i]]
}
}
}
return dp[0][target]
}