publicstaticbooleanfindSum(int[] nums,int s){// dp[i][j] whether we can get j after scanning the first i elementsboolean[][] dp =newboolean[nums.length +1][s +1];
dp[0][0]=true;for(int i =1; i <= nums.length; i++){for(int j =0; j <= s; j++){
dp[i][j]= dp[i-1][j];if(!dp[i][j]& j >= nums[i-1]){
dp[i][j]= dp[i-1][j-nums[i-1]];}}}return dp[nums.length][s];}
2. 数组中和为某个特定值的元素组合个数
publicstaticintgetSum(int[] nums,int s){// dp[i][j] means the number of ways of getting j after scanning the first i elementsint[][] dp =newint[nums.length +1][s +1];
dp[0][0]=1;for(int i =1; i <= nums.length; i++){for(int j =0; j <= s; j++){
dp[i][j]= dp[i-1][j];if(j >= nums[i-1]){
dp[i][j]+= dp[i-1][j-nums[i-1]];}}}return dp[nums.length][s];}
3. 数组中和为某个特定值的所有元素组合(回溯法)
publicstatic List<List<Integer>>getAllSum(int[] nums,int s){
List<List<Integer>> res =newArrayList<>();backtrack(res,newArrayList<>(), nums, s,0,0);return res;}publicstaticvoidbacktrack(List<List<Integer>> res, List<Integer> temp,int[] nums,int s,int cusSum,int start){if(curSum == s){
res.add(newArrayList<>(temp));}for(int i = start; i < nums.length; i++){
temp.add(nums[i]);backtrack(res, temp, nums, s, curSum + nums[i], i +1);
temp.remove(temp.size()-1);}}
1. 数组中是否存在某个元素组合,使得组合中所有元素的和为某个特定值public static boolean findSum(int[] nums, int s) { // dp[i][j] whether we can get j after scanning the first i elements boolean[][] dp = new boolean[nums.length + 1][s + 1]; dp[0][0] = true; for (int i = 1