动态规划之划分数组形成两个和相等的子集
? ? ? ??Input: [1, 5, 11, 5]
? ? ? ? Output: true
? ? ? ? Explanation: The array can be partitioned as [1, 5, 5] and [11].
打印:
sum=10
target=5
nums[i]=1
j=5,dp[j]=0,0
j=4,dp[j]=0,0
j=3,dp[j]=0,0
j=2,dp[j]=0,0
j=1,dp[j]=0,1? ? ? ? ? ? ? //dp[1] = 1 ,數組是否可以取出若干個數字,其和為1,因為第一個數為1
--------------------------------------------
nums[i]=3
j=5,dp[j]=0,0
j=4,dp[j]=0,1? ? ? ? ? ? //dp[4] = 1 ,數組是否可以取出若干個數字,其和為4,因為dp[1]=1,nums[i]=3,相加和剛好是4
j=3,dp[j]=0,1? ? ? ? ? ? //dp[3] = 1 ,數組是否可以取出若干個數字,其和為3,剛好這個數為3
--------------------------------------------
nums[i]=2
j=5,dp[j]=0,1? ? ? ? ? ??//dp[5] = 1 ,數組是否可以取出若干個數字,其和為5,因為d[3]=1
j=4,dp[j]=1,0? ? ? ? ? ??//dp[4] = 1 ,上面已經為1了
j=3,dp[j]=1,1? ? ? ? ? ? //dp[3]和dp[1]都為1
j=2,dp[j]=0,1? ? ? ? ? ? //dp[0]為1
--------------------------------------------
nums[i]=4
j=5,dp[j]=1,1? ? ? ? ? ?//d[5]和dp[1]都為1
j=4,dp[j]=1,1? ? ? ? ? ?//d[4]和dp[0]都為1
--------------------------------------------
1
上面的思路相對數組中每個數求dp,最后就會找到dp[target]是否為true,如果 dp[j - nums[i]] 為true的話,說明現在已經可以組成 j-nums[i] 這個數字了,再加上nums[i],就可以組成數字j了。當j=target是同樣道理,要想找到dp[target]為true,就找找到數組中幾個值的和為target時,對應下標的dp值為true,這樣反推dp[target]為true。
?
參考地址:https://blog.csdn.net/qq_40320556/article/details/89875463
總結
以上是生活随笔為你收集整理的动态规划之划分数组形成两个和相等的子集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划之等差递减区间个数
- 下一篇: 动态规划--用最少的硬币类别找零钱