Day41 动态规划第三天
LeetCode 416.分割等和子集
cpp
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
// dp[i]中的i表示背包内总和
// 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200
// 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了
vector<int> dp(10001, 0);
for(int i=0; i<nums.size();i++) {
sum+=nums[i];
}
// 也可以使用库函数一步求和
// int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum%2==1) return false;
int target=sum/2;
// 开始 01背包
for(int i=0; i<nums.size();i++) {
for(int j=target;j>=nums[i];j--) {
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
if (dp[target]==target) return true;
return false;
}
};
今天只有一道题,整完再重新看一遍背包问题的详解。