题目要求:
分析:
这道题可以转化为0 - 1背包来做。具体思路可参考:(https://leetcode-cn.com/problems/target-sum/solution/python-dfs-xiang-jie-by-jimmy00745/)总之。转化为0 - 1背包之后,就可以写出其递推方程。
具体代码如下:
class Solution {
public int findTargetSumWays(int[] nums, int S) {
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
}
if((sum + S) % 2 != 0 || S > sum)
return 0;
int[][] dp=new int[nums.length+1][(sum + S) / 2+1];
for(int i = 0; i <= nums.length; i ++) {
dp[i][0]=1;
}
for(int i = nums.length; i > 0; i --) {
for(int j=0; j <= (sum + S) / 2; j ++){
if(j - nums[i - 1] < 0) {
dp[i - 1][j] = dp[i][j];
} else {
dp[i-1][j]=dp[i][j]+dp[i][j-nums[i-1]];
}
}
}
return dp[0][(sum + S) / 2];
}
}
我觉得对于动态规划的解法还是不是很清楚,这里可以用递归来做,虽然性能差,但是比较简单:
class Solution {
int result = 0;
public int findTargetSumWays(int[] nums, int S) {
dfs(nums, S, 0); //递归
return result;
}
public void dfs(int[] nums, int S, int i){
if(i >= nums.length) {
if(S == 0)
result ++;
return;
}
dfs(nums, S - nums[i], i + 1);
dfs(nums, S + nums[i], i + 1);
}
}
把动态规划的思路给理了一遍,觉得差不多理清楚了,按照自己现在的思路重新写了一遍代码,确实就是一个0,1背包的问题,具体代码如下:
class Solution{
public static int findTargetSumWays(int[] nums, int S) {
int sum = 0;
for(int i = 0; i < nums.length; i ++) {
sum += nums[i];
}
if((sum + S) % 2 != 0 || S > sum)
return 0;
int target = (sum + S) / 2;
int[][] dp = new int[nums.length + 1][target + 1];
dp[0][0] = 1;
for(int i = 1; i <= nums.length; i ++) {
for(int j = 0; j <= target; j ++) {
if(j < nums[i - 1]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i - 1]];
}
}
}
return dp[nums.length][target];
}
}
这里要设置其初始值dp[0][0],不能忘记。