题目:
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
题解思路:
方法一:一维度dp+完全背包
函数代码:
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int n=nums.size();
int sum=0;
for(int i=0;i<n;i++)
{
sum=sum+nums[i];
}
if(sum<S||(sum+S)%2==1)
{
return 0;
}
sum=(sum+S)/2;
vector<vector<int>>dp(n+1,vector<int>(sum+1,0));
for(int i=0;i<=n;i++)
{
dp[i][0]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum;j++)
{
if(j>=nums[i-1])
{
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
}
else
{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[n][sum];
}
};