有没有人能解决以下问题?这似乎是一个经典问题,但我还没有在网上找到任何好的答案。
给定目标编号和一系列候选编号,打印出所有组合,以便候选编号的总和等于目标。
此处顺序并不重要,因此请勿打印重复的组合。
e.g。目标是7,候选人是2,3,6,7 输出应为7和3 + 2 + 2(但不能打印2 + 3 + 2,2 + 2 + 3)
答案 0 :(得分:1)
由于您必须打印所有组合,因此您可以使用递归的常规完整搜索程序。例如,this code解决了问题并打印了所有这些组合。
import java.io.*;
import java.math.*;
import java.util.*;
class Solution{
public static void main(String[] args)throws java.lang.Exception{
new Solution().run();
}
int N = 7;
int[] arr = {2, 3, 6, 7};
int[] vals = new int[N];;
void run(){
printCombinations(N, 0, 0);
}
// from : consider numbers in arr from index "from"
// index: add new number in array vals at index "index"
void printCombinations(int target, int from, int index){
if(target==0){
for(int i=0; i<index; i++){
System.out.print(vals[i] + " ");
}
System.out.println();
}else if(target<0 || from>=arr.length){
return;
}else{
vals[index] = arr[from];
// take arr[from] in set
printCombinations(target-arr[from], from, index+1);
// dont take arr[from] in set
printCombinations(target, from+1, index);
}
}
}
使用printCombinations函数的唯一前提条件是数组arr不能包含重复项。如果它包含重复项,我们可以使用Set轻松删除它们。
在代码中N是必需的目标。 arr是一组候选人数字。 对于N = 7和arr [] = {2,3,6,7}代码打印:
2 2 3
7
答案 1 :(得分:0)
看看这个使用回溯的代码。
public static void main (String[] args) {
int[] arr = {2,3,6,7};
int target = 9;
ArrayList<Integer> result = new ArrayList<Integer>();
printCombinations(result, arr, target, 0);
}
private static void printCombinations(ArrayList<Integer> result, int[] arr, int target, int counter) {
if(target == 0) {
System.out.println(result);
return;
}
if(target < 0 || counter>=arr.length) {
return;
}
result.add(arr[counter]);
printCombinations(result, arr, target-arr[counter], counter);
result.remove(result.indexOf(arr[counter]));
printCombinations(result, arr, target, counter+1);
}
如果候选人号码必须只使用一次,那么只需改变第一次递归呼叫并使用'counter + 1'而不是'counter'。
private static void printCombinations(ArrayList<Integer> result, int[] arr, int target, int counter) {
if(target == 0) {
System.out.println(result);
return;
}
if(target < 0 || counter>=arr.length) {
return;
}
result.add(arr[counter]);
printCombinations(result, arr, target-arr[counter], counter+1);
result.remove(result.indexOf(arr[counter]));
printCombinations(result, arr, target, counter+1);
}