Leetcode--416. 分割等和子集
給定一個只包含正整數的非空數組。是否可以將這個數組分割成兩個子集,使得兩個子集的元素和相等。
注意:
每個數組中的元素不會超過 100
數組的大小不會超過 200
示例 1:
輸入: [1, 5, 11, 5]
輸出: true
解釋: 數組可以分割成 [1, 5, 5] 和 [11].
?
示例?2:
輸入: [1, 2, 3, 5]
輸出: false
解釋: 數組不能分割成兩個元素和相等的子集.
思路:從數組中選取一些元素使他的和等于總和的一半,類似于背包問題
通過dp[][]來記錄狀態
dp[i][j]:表示選取范圍為[0,i-1]的條件下和為j的情況
dp[i][j]狀態與兩個元素有關
1. dp[i-1][j],在[0,i-1]的情況下選取的元素和為j,不選取第i個元素,和仍為j
2. dp[i-1][j-nums[i]],選取第i個元素,那么如果之前存在和為j-nums[i]的情況,就說明和為j的情況存在
提交的代碼:
class?Solution?{
????public?boolean?canPartition(int[]?nums)?{
????????int?i,sum=0;
????????for(i=0;i<nums.length;i++)
????????{
????????????sum+=nums[i];
????????}
????????if(sum%2!=0)
????????{
????????????return?false;
????????}
????????int?target?=?sum/2;
????????boolean?dp[][]?=?new?boolean[nums.length][target+1];
????
????????if(nums[0]<=target)
????????{
????????????dp[0][nums[0]]?=?true;
????????}
????????for(i=1;i<nums.length;i++)
????????{
????????????for(int?j=0;j<=target;j++)
????????????{
????????????????dp[i][j]?=?dp[i-1][j];
????????????????if(j>=nums[i])
????????????????{
????????????????????dp[i][j]?=?dp[i-1][j]?||?dp[i-1][j-nums[i]];
????????????????}
????????????}
????????}
????????for(i=0;i<nums.length;i++)
????????{
????????????if(dp[i][target])
????????????{
????????????????return?true;
????????????}
????????}
????????return?false;
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--416. 分割等和子集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--229. 求众数Ⅱ
- 下一篇: 北理计算机教案,北理工版三年级信息技术教