order matters
recursion:
public class Recursion {
public int combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
return helper(candidates, target) ;
}
public int helper(int[] candidates, int target) {
if (target == 0) {
return 1;
} else if (target < 0) {
return 0;
}
int count = 0;
for (int i : candidates) {
count += helper(candidates, target - i);
}
return count;
}
public static void main(String[] args) {
Recursion test = new Recursion();
int[] inputs = new int[]{1, 2, 5};
System.out.println(test.combinationSum(inputs, 4));
}
}
dynamic programming
public class DP {
public int combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
if (target == 0) {
return 0;
}
int[] table = new int[target + 1];
table[0] = 1;
for (int i = 1; i <= target; i++) {
//check all numbers
for (int num : candidates) {
if (num <= i) {
table[i] += table[i - num];
}
}
}
return table[target];
}
public static void main(String[] args) {
int[] candidates = {2, 3, 6, 7};
DP test = new DP();
System.out.println(test.combinationSum(candidates, 7));
}
}