又是做过的题 但又没思路TT 已经不求新题有思路了 什么时候才能实现做过的题的思路自由啊
题目描述
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.
Example 1:
Input: nums = [1,5,11,5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: nums = [1,2,3,5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.
思路
动态规划的01背包问题,真是不容易想到这里。
因为以前做过知道是这个思路,但就是想不到实操。
1、dp数组的含义: dp[j]表示 容量为j的背包最多可以价值为多少的物品
nums中的数字即为物品 价值和重量为本身
背包容量就是sum/2
这里就很巧妙 如果刚好能装满 就满足题意 因为装满的是一半 剩下的肯定就是另一半
2、递推公式
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
3、初始化
value没有负值 可以全初始化为0
4、遍历顺序
先物品后背包 物品按顺序 背包从后向前
5、推导 略
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
sum=accumulate(nums.begin(),nums.end(),sum);
if(sum%2)return false;
sum/=2;
vector<int>dp(sum+1,0);
for(int i=0;i<nums.size();i++){
for(int j=sum;j>=nums[i];j--){
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
if(dp[sum]==sum) return true;
else return false;
}
};
其实还应该再做一道类似的题 但是我真的不想做了