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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode动态规划 分割等和子集

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode动态规划 分割等和子集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

思路
這道題假如能看出是一道0-1背包問題的話,就很好解決了。題目說需要劃分成兩個和相等的子集,那么需要滿足:
1.每個元素必須被使用且只能被使用一次
2.兩個子集的和相等,子集和相加必為偶數

根據子集和相加必為偶數這一點,當nums數組元素和sum是奇數時,直接return false。那么接下來問題就可以轉化成能否選取幾個物品使其重量和為sum/2的問題。

狀態轉移方程
dp[i][j] = true, when dp[i-1][j] == true
dp[i][j] = true, when j == nums[i]
dp[i][j] = dp[i-1][j-nums[i]], when j > nums[i]

邊界條件
若nums[0] <= sum/2,dp[0][0] = true

注明
為什么此處的初始化不像一般的背包問題那樣是個循環呢,我想了一下一般的背包問題是求最大價值和的,所以需要循環一般dp[0][j]記錄各自中間值。而本題中不需要記錄中間值,只需要判斷是true還是false,因此僅需判斷dp[0][0]是否為true即可。

代碼

class Solution { public:bool canPartition(vector<int>& nums) {int sum = 0;int len = nums.size();for(auto num : nums)sum += num;if(sum % 2) return false;int bag_size = sum / 2;bool dp[205][10005] = {false};if(nums[0] <= bag_size)dp[0][nums[0]] = true;for(int i = 1; i < len; i++)for(int j = 0; j <= bag_size; j++){if(dp[i-1][j] == true)dp[i][j] = true;else if(j == nums[i])dp[i][j] = true;else if(j > nums[i])dp[i][j] = dp[i-1][j-nums[i]];}return dp[len-1][bag_size];} };

總結

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

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