您的位置:首页 > Web前端 > JavaScript

[leetcode]494. Target Sum -- JavaScript动态规划求解

2017-03-28 15:31 302 查看
先上代码:

var findTargetSumWays = function(nums, S) {
var sum = 0;
nums.forEach(function(num){
sum += num;
});
if(S>sum || S<-sum) return 0;
var dp = [];
dp[0+sum] = 1;
var maxIndex = sum*2+1;
nums.forEach(function(num){
var tmp = [];
for(var k=0;k<maxIndex;k++){
if(dp[k] !== undefined && dp[k] !== 0){
if(tmp[k+num] === undefined){
tmp[k+num] = dp[k];
}else{
tmp[k+num] += dp[k];
}

if(tmp[k-num] === undefined){
tmp[k-num] = dp[k];
}else{
tmp[k-num] += dp[k];
}
}
}
dp = tmp;
});
return dp[S+sum]===undefined?0:dp[S+sum];
};


这道题一开始我是用递归的方式求解,但是会超时,因此就改用了动态规划。

下面说一下对于这道题我的理解,动态规划我也不是很熟悉,仅作为参考吧,欢迎指正。

首先说一下这道题主要的思路。

第一,在我们对数组的访问过程中,动态规划数组dp,是不断变化的。

第二,动态数组dp的含义:当我们对数据访问到某个阶段m的时候,dp
的含义就表示,在阶段m这一刻时,到达n的可选方式有dp
种。

针对本道题来说,就是当我对数组访问到第m个的时候,那么这前m-1个数字所能组合成结果n的方式有dp
种。

第三,初始条件dp[0+sum] = 0的含义:当我们没有对数组进行任何访问的时候,我们可以获得总和0的选择有且只有一种,那就是数组中的数我们一个都不选。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息