//动态规划
//时间复杂度O(n*target)
//空间复杂度O(n*target)
//状态是考虑放入第i个数字
//由此状态转移方程为f(i,target)=f(i-1,target)+f(i-1,target-nums[i])+f(i,target-nums[i])
public int DongCombinationSum4(int[] nums, int target) {
int n=nums.length;
if(n==0||target<0){
return 0;
}//如果没有数字或者目标数字小于0,返回0就可以了
int[][]memo=new int[n][target+1];//表示范围[0,index]的数字组成target的所有的方案
for(int j=0;j<=target;j++){
if(j%nums[0]==0){
memo[0][j]=1;
}else{
memo[0][j]=0;
}
}
for(int i=1;i<n;i++){
for(int j=0;j<=target;j++){
if(j>=nums[i]){
memo[i][j]=memo[i-1][j]+memo[i-1][j-nums[i]]+memo[i][j-nums[i]];
/*
这里我认为的是和完全背包问题是一样的,就是对于[0-i]的目标为j,组成它的情况
就是要么不取第i个数字,那就是对于[0,i-1]目标为j的情况,以及要么取第i个数字
那就是对于[0,i-1]目标为j-nums[i]的情况,还有一种就是对于[0,i],目标为j-nums[i]
的情况,这三种情况的和就是最后的结果,但是答案和预想的不一样
*/
}else{
memo[i][j]=memo[i-1][j];
}
}
}
return memo[n-1][target];
}
老师麻烦看一下,我这个问题的思路出错在哪里了?