日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划之划分数组形成两个和相等的子集

發布時間:2025/6/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划之划分数组形成两个和相等的子集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ??Input: [1, 5, 11, 5]
? ? ? ? Output: true
? ? ? ? Explanation: The array can be partitioned as [1, 5, 5] and [11].

#include<iostream> #include<vector> using namespace std;//dp[i]表示原數組是否可以取出若干個數字,其和為i class Solution { public:bool canPartition(vector<int>& nums) {int sum = 0;for(int i = 0 ; i < nums.size() ; i ++){sum += nums[i];}cout << "sum=" << sum << endl;if(sum % 2 != 0) //判斷整個和是否為偶數return 0;int target = sum / 2;cout << "target=" << sum/2 << endl;vector<int> dp(target + 1, 0);dp[i]表示原數組是否可以取出若干個數字,其和為i dp[0] = 1; //邊界for(int i = 0 ; i < nums.size(); i ++){cout << "nums[i]=" << nums[i] << endl;for(int j = target; j >= nums[i]; j --){ //如果 dp[j - nums[i]] 為true的話,說明現在已經可以組成 j-nums[i] 這個數字了//再加上nums[i],就可以組成數字j了cout << "j=" << j << "," << "dp[j]=" << dp[j] << "," << dp[j-nums[i]] << endl;dp[j] = dp[j] || dp[j-nums[i]];}cout << "--------------------------------------------" <<endl;}return dp[target];} };int main() {vector<int> temp {1, 3, 2, 4};Solution text;cout << text.canPartition(temp) << endl;return 0; }

打印:

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

總結

以上是生活随笔為你收集整理的动态规划之划分数组形成两个和相等的子集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。