思路:
//1、将问题转换为,根据给定的一组数字(数量是指定的),寻找所有的组合方案
//2、这个思路可用于,coin change问题,等一类组合问题
//3、注意如果给定的数字可以重复使用,那么循环可以从下往上走,参考注释掉的部分
题目:
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols +
and -
. For each integer, you should choose one from +
and -
as its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5 Explanation: -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 There are 5 ways to assign symbols to make the sum of nums be target 3.
Note:
- The length of the given array is positive and will not exceed 20.
- The sum of elements in the given array will not exceed 1000.
- Your output answer is guaranteed to be fitted in a 32-bit integer.
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
//对初始的输入进行判断
int len=nums.size();
if(len==0) return 0;
int sum=0;
int target;
for(int i=0;i<len;i++)
{
sum+=nums[i];
}
//提前判断无解情况
//1、所有的数字加起来都无法达到期望
if(sum<S) return 0;
//2、根据计算推出,(sum-S)必须为偶数,否则无解
if(((sum-S)%2)!=0) return 0;
//提前判断无解情况
//1、将问题转换为,根据给定的一组数字(数量是指定的),寻找所有的组合方案
//2、这个思路可用于,coin change问题,等一类组合问题
//3、注意如果给定的数字可以重复使用,那么循环可以从下往上走,参考注释掉的部分
target=(sum-S)/2;
vector<int> dp(target+1,0);
dp[0]=1;
for(int i=0;i<len;i++)
{
for(int j=target;j>=nums[i];j--)
//for(int j=num[i];j<=target;j++)
{
dp[j]+=dp[(j-nums[i])];
}
}
return dp[target];
}
};