https://leetcode.cn/problems/target-sum/submissions/578416691/
思考1:对于本题,虽然说是非负,但是其实非不非负都一样的,负数可以在前加一个负号变成正数
思考2:总和如果小于abs(k)直接return 0;
思考3:对于一个数组来说,加减正负号其实不改变总和奇偶性,所以总和和k的奇偶性不一样,就不行
思考4:转换公式,假象数组内部有一些数是正的,有一些是负的,把他们分类到A和B集合中,那么提议就是A-B=k–>A=k+B–>2*A=k+sum–>A=(k+sum)/2,记(k+sum)/2为os,A是数组内的一些正数,那么转化为01背包就是在数组内找到一些数其值为os的又多少,设dp[i][j]为前i个和为j的
方数,这样dp[0][0]=1
int dp[1010];
int a[1010];
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
for(int i=0;i<=1005;i++) a[i]=dp[i]=0;
int n=nums.size();
int sum=0;
for(int i=0;i<n;i++) sum+=nums[i];
if(sum%2!=abs(target)%2||sum<abs(target)) return 0;
int k=(target+sum)/2;
for(int i=0;i<n;i++) a[i+1]=nums[i];
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=k;j>=a[i];j--)
{
dp[j]=dp[j]+dp[j-a[i]];
}
}
return dp[k];
}
};