class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum=0;
for(int i:nums){
sum=sum+i;
}
int length=nums.length;
sum=sum*2+1;
if(target>sum/2||target<-sum/2){
return 0;
}
int[][] dp=new int[length][sum];
//前一个数表示的是使用的0-i位数,而后面的表示的想要凑出的target,很
dp[0][nums[0]+sum/2]=1;
//在初始化的时候需要注意的一点,就是如果加上nums[0]与减去nums[0]自己是一样的话,就会重合。那么方法数就为2
if((nums[0]+sum/2)==(-nums[0]+sum/2)){
dp[0][-nums[0]+sum/2]=2;
}else{
dp[0][-nums[0]+sum/2]=1;
}
//本题其实也是类似于一个0,1背包问题,+表示加入该数,-表示不加入该数。
// 数组中的元素可以表示的范围应该是-sum到sum,但是考虑到数组下标只能为正数,所以我们统一向右平移sum/2个单位
for(int i=1;i<length;i++){
for(int j=-sum/2;j<=sum/2;j++){
int m,k;
if(j+nums[i]+sum/2 > sum-1){ //考虑的是右边界条件
m=0;
}else{
m=dp[i-1][j+nums[i]+sum/2];
}
if(j-nums[i]+sum/2 < 0){ //考虑的是左边界条件
k=0;
}else{
k=dp[i-1][j-nums[i]+sum/2];
}
dp[i][j+sum/2]=m+k;
//第i个元素构成j的方法数量等于之前的元素加上自己或者减去自己的数量
}
}
return dp[length-1][target+sum/2];
}
}
Leetcode 494:目标和
最新推荐文章于 2024-10-01 05:04:32 发布