题意理解
给定一数组,在每个数前增加+,-符号构成表达式,求和等于S的数量。
问题分析
动规
状态量是前i个数字,和等于j的数量。
状态转移方程是前i个数字,和等于j的数量等于前i-1个数字,和等于j-当前数字的数量 + 前i-1个数字,和等于j+当前数字的数量。
其他
链接
int findTargetSumWays(vector<int>& nums, int S) {
int sum = accumulate (nums.begin(), nums.end(), 0); //计算数组和
if (S > sum || S < -sum) { //目标和不在正负数组和之间
return 0; //结束
}
int len = nums.size(); //数组长度
vector<vector<int>> dp(len + 1, vector<int>(2 * sum + 1, 0)); //dp[i,j]表示前i个元素和为j-sum的数量,这是将-sum,sum化为0,2*sum
dp[0][sum] = 1; //预制0个元素,和为0(对应j=sum)的数量为1.
for (int i = 1; i != len + 1; i ++) { //遍历前i个元素,从i=1开始
for (int j = 0; j !=