494. Target Sum(动态规划)

来源:互联网 发布:linux抓包命令 编辑:程序博客网 时间:2024/06/11 02:41

上一篇题解涉及到的只是整数取1的情况,根据这个思路可以拓展到非1的整数集合,下面应用动态规划的思想解决上述的问题:

题意还是如此,从N个数中选出来

状态方程:

dp[i][j]表示前i个数和为j的方案个数

状态转移:

dp[i][j]=dp[i-1][j]+dp[i][j-nums[i]],其中sign=+1 or -1。

最终状态:

dp[N][target] ,其中target=(target+sum)/2

代码:

class Solution {public:    int findTargetSumWays(vector<int>& nums, int S) {    //test    int sum=0;    for(int i=0;i<nums.size();i++){        sum+=nums[i];    }    if(sum<S||sum<-S) return 0;    if((sum+S)%2==1||nums.size()==0) return 0;        int target=(sum+S)/2;    vector<vector<int>> dp(nums.size(),vector<int>(target+1,0));    for(int i=0;i<=target;i++)    {if(nums[0]==i)      dp[0][i]=1;}      dp[0][0]+=1;    for(int i=1;i<nums.size();i++){        for(int j=0;j<=target;j++)        { if(j>=nums[i])        dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];        else        dp[i][j]=dp[i-1][j];        }    }    return dp[nums.size()-1][target];    }};