【刷题笔记】--dp--01背包--494. 目标和

题目:

【刷题笔记】--dp--01背包--494. 目标和_第1张图片

思路: 

首先这道题要转化为01背包的模型是难点,

【刷题笔记】--dp--01背包--494. 目标和_第2张图片 

这样我们就可以把sumA求出来,sumA表示这个数组中附加号的数相加的值,相当于这道题就转化为已知每个物品的重量,背包只能放sumA的容量,要怎么放才能让背包容量刚刚好等于sumA。

按照01背包的正常思路:dp[i][j]表示前i个数装满背包总容量为j总共有多少方法。

有两种情况:

①j

②其他情况下,dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];

初始化:如下

为什么j=0的那一列不能直接初始化,如果是dp[2][0],数组为[1,1,1,1,1],是不是有两种方法使target=0;-1+1 or +1-1 所以不能轻易直接初始化。

 【刷题笔记】--dp--01背包--494. 目标和_第3张图片

 代码:

int findTargetSumWays(int* nums, int numsSize, int target){
    int sum=0;
    int i,j;
    for(i=0;i=nums[i-1]){
                dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
            }
            else{
                dp[i][j]=dp[i-1][j];
            }
        }
    }
    return dp[numsSize][bagSize];

}

你可能感兴趣的:(动态规划,算法)