给定一个数组arr,和一个整数aim,如果可以任意选择arr中的数字,判断能不能累加得到aim,
参考了https://blog.csdn.net/pcwl1206/article/details/89476568
递归版本:
public static isSum(int arr[],int i,int sum,int aim){
if(i==arr.length){
return sum==aim;
}
return isSum(arr,i+1,sum,aim)||isSum(arr,i+1,sum+arr[i],aim);
}
动态规划版本:
public static boolean isSum2(int arr[],int aim){
if(arr==null ||arr.length==0){
return false;
}
boolean [][]dp=new boolean[arr.length+1][aim+1];
//填最后一行
for(int i = arr.length, sum = 0; sum <= aim; sum++){
if(sum == aim){
dp[i][sum] = true; // 目标值处设置为 true
}else{
dp[i][sum] = false;
}
}
for(int i=arr.length-1;i>=0;i--){
for(int j=aim-1;j>=0;j--){
//先填最后一列
dp[i][j]=dp[i+1][j];
//再往上填
if(j+arr[i]<=aim){
dp[i][j]=(dp[i][j]||dp[i+1][j+arr[i]]);
}
}
}
//因为这是从下往上填dp表,所以最后得到的是dp[0][0]
return dp[0][0];
}