[集合能不能分成2个相等的子集]
https://leetcode-cn.com/problems/partition-equal-subset-sum
Note:
Each of the array element will not exceed 100.
The array size will not exceed 200.
Example 1:
Input: [1, 5, 11, 5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: [1, 2, 3, 5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.
-
数字是物品重量,和的一半是背包,dp记录true or false
-
初始化时,dp全为false
-
同样注意 dp[0]初始化为true,这样才能使 重1的物品面对1体积背包时候,d[1] = d[1](初始化为false) || d[1-1] = true
-
状态转移为 当前更新dp上面的一个结果和左边一个结果的与操作 dp[v] = dp[v] || dp[v-w[i]]
-
注意从后面开始遍历,不然下图的1那一行会变成都是True
如图,令集合为1 5 11 5 sum一半是1,背包从0到12
从右至左更新
背包 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
初始化 | true | false | false | false | false | false | false | false | false | false | false | false | false |
1 | T | T | F | F | F | F | F | F | F | F | F | F | F |
5 | T | T | F | F | F | T | T | F | F | F | F | F | F |
11 | T | T | F | F | F | T | T | F | F | F | F | T | T |
5 | T | T | F | F | F | T | T | F | F | F | F | T | T |
这该死的长度限制 cnblog改一下
cnblogs_post_body th, #cnblogs_post_body td, .cnblogs-post-body th, .cnblogs-post-body td {
border: 1px solid #c0c0c0;
border-collapse: collapse;
padding: 8px 14px;
/*min- 50px;*/
min- inherit;
}
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
int sum=0;
for (int num : nums) sum += num;
if(sum % 2) return false;
sum = sum/2;
vector<bool> dp(sum+1, false);
dp[0] = true;
for(int i=0;i<n;i++){
for(int j=sum;j>=nums[i];j--){
dp[j] = dp[j] || dp[j-nums[i]];
}
}
return dp[sum];
}
};