【发布时间】:2017-06-15 11:48:42
【问题描述】:
在leetcode中遇到一个问题,看了别人用DP的解决方案,但有一点看不懂,希望大家指点一下。
问题是:给定一个只包含正整数的非空数组,找出有多少种方法可以选择其中一些和等于目标 S 的整数。
解决办法是:
int findTargetSumWays(vector<int>& nums, int S)
{
int n = nums.size();
vector<int> dp(S+1, 0);
dp[0] = 1;
for(int i=0; i<n; i++)
for(int j=S; j>=nums[i]; j--)
//for(int j=nums[i]; j<=S; j++) //why it is wrong?
{
dp[j] += dp[j-nums[i]];
}
return dp[S];
}
代码中,第二个循环从S向下计数到nums[i],但是为什么不能从nums[i]向上计数到S呢?我知道如果向上计数,结果会比答案大得多,但我无法弄清楚向上计数的本质问题。
感谢任何帮助!
【问题讨论】:
标签: c++ algorithm dynamic-programming