Day41 动态规划第三天
LeetCode 416.分割等和子集
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;}
};
今天只有一道题,整完再重新看一遍背包问题的详解。