File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change @@ -706,6 +706,57 @@ class Solution:
706706```
707707
708708### Go
709+ 二维dp
710+ ``` go
711+ func findTargetSumWays (nums []int , target int ) int {
712+ sum := 0
713+ for _ , v := range nums {
714+ sum += v
715+ }
716+ if math.Abs (float64 (target)) > float64 (sum) {
717+ return 0 // 此时没有方案
718+ }
719+ if (target + sum) % 2 == 1 {
720+ return 0 // 此时没有方案
721+ }
722+ bagSize := (target + sum) / 2
723+
724+ dp := make ([][]int , len (nums))
725+ for i := range dp {
726+ dp[i] = make ([]int , bagSize + 1 )
727+ }
728+
729+ // 初始化最上行
730+ if nums[0 ] <= bagSize {
731+ dp[0 ][nums[0 ]] = 1
732+ }
733+
734+ // 初始化最左列,最左列其他数值在递推公式中就完成了赋值
735+ dp[0 ][0 ] = 1
736+
737+ var numZero float64
738+ for i := range nums {
739+ if nums[i] == 0 {
740+ numZero++
741+ }
742+ dp[i][0 ] = int (math.Pow (2 , numZero))
743+ }
744+
745+ // 以下遍历顺序行列可以颠倒
746+ for i := 1 ; i < len (nums); i++ { // 行,遍历物品
747+ for j := 0 ; j <= bagSize; j++ { // 列,遍历背包
748+ if nums[i] > j {
749+ dp[i][j] = dp[i-1 ][j]
750+ } else {
751+ dp[i][j] = dp[i-1 ][j] + dp[i-1 ][j-nums[i]]
752+ }
753+ }
754+ }
755+ return dp[len (nums)-1 ][bagSize]
756+ }
757+ ```
758+
759+ 一维dp
709760``` go
710761func findTargetSumWays (nums []int , target int ) int {
711762 sum := 0
You can’t perform that action at this time.
0 commit comments