class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
/*
题意分解:
将nums中元素按+, -分为A(全为+), B(全为-)两堆;则有
A - B = target;
A + B = sum;
所以 (sum + target) / 2 = A; (sum - target) / 2 = B;
所以我们每次只需要把A分出来即可,即求元素和为(sum + target) / 2的堆数
dp[j] : 待定元素和为 j ,在nums中选择得到的最大堆数; 对每个nums[i],有选和不选两种情况
dp[j] = max(不选nums[i], 选择nums[i]);
dp[j] = max(dp[j], dp[j] + dp[j - nums[i]]);
*/
vector<int> dp(1001);
int sum = 0;
for(int i = 0; i < nums.size(); i ++){
sum += nums[i];
}
if(abs(target) > sum) return 0;
if((target + sum) % 2 == 1) return 0; // A实际为一个浮点数,无法整除2
int t = (sum + target) >> 1;
dp[0] = 1; // 初始化,所有元素都不选的堆只有一种
for(int i = 0 ; i < nums.size(); i ++){
for(int j = t; j >= nums[i]; j --)
dp[j] = max(dp[j], dp[j] + dp[j - nums[i]]);
}
return dp[t];
}
};
<Talk is cheap, show me the code 10> LeetCode.494 目标和
于 2024-06-27 11:46:53 首次发布