2017-12-11 11 views
0

나는 숫자 목록을 가지고 있습니다 : [10, 13, 15]. 현재동일한 번호를 사용하는 조합을 포함하여 재귀를 사용하여 목록에서 모든 조합 가져 오기

public void combinations(ArrayList<Integer>data,int fromIndex, int endIndex) 
{ 
    int sum = 0; 
    int target = 28; 
    ArrayList<Integer>results = new ArrayList<Integer>(); 
    if(fromIndex == endIndex) 
    { 
     return; 
    } 

    for(int currentIndex = fromIndex; currentIndex < endIndex; currentIndex++) 
    { 
     if(sum + data.get(currentIndex) <= target) 
     { 
      results.add(data.get(currentIndex)); 
      sum +=data.get(currentIndex); 
     } 

    } 

    System.out.println(results); 
    combinations(data, fromIndex + 1, endIndex); 
} 

이 출력 : 내가 덜 나는 재귀 방법이 현재 28

의 대상보다까지 추가되거나 목록에서 숫자의 조합을 찾기 위해 노력하고 [10, 13],[13, 15],[15]을하는 올바른지, 왜 재귀 적 방법이 +1인지에 따라 이러한 솔루션을 얻는 지 이해할 수 있습니다. 그러나 [10],[13],[10,10] 등의 다른 솔루션은 포함되어 있지 않으며이 구현 방법에 대해 궁금해하고 있습니다. 재귀 적 방법으로 증분을 변경해야합니까?

+0

는 @ [대니] (https://stackoverflow.com/users/8747735/danny) [10, 10] 없습니다 [10, 15] –

+0

@BrijRajKishore에 대한 확신하는 [10, 10] 일 것 이것은 올바른 해결책으로 20보다 작아서 올바른 해결책을 찾지 못합니다. – Danny

+1

@ [Danny] (https://stackoverflow.com/users/8747735/danny) 그러면 0과 음수에 대한 무한 재귀가됩니다. –

답변

1
public static void combinations(ArrayList<Integer> arr, ArrayList<ArrayList<Integer>> ans, int startIndex, int endIndex, int sum) { 

    if(startIndex > endIndex) { 
     for(ArrayList<Integer> x : ans) { 
      System.out.println(x); 
     } 
     return; 
    } 
    ArrayList<Integer> newTemp; 
    ArrayList<ArrayList<Integer>> newAns = new ArrayList<ArrayList<Integer>>(); 
    for(ArrayList<Integer> x : ans) { 
     newAns.add(x); 
    } 
    for(ArrayList<Integer> x : ans) { 
     int s = 0; 
     newTemp = new ArrayList<Integer>(); 
     for(Integer v : x) { 
      newTemp.add(v); 
      s+=v; 
     } 
     if(s + arr.get(startIndex) <= sum) { 
      newTemp.add(arr.get(startIndex)); 
      newAns.add(newTemp); 
     } 
    } 

    if(arr.get(startIndex) <= sum) { 
     newTemp = new ArrayList<Integer>(); 
     newTemp.add(arr.get(startIndex)); 
     newAns.add(newTemp); 
    } 

    combinations(arr,newAns, startIndex+1, endIndex, sum); 
} 

코드를 검토 할 수 없어 코드를 다시 작성해야합니다.

두 번째로, 나는 처음으로 직면 한 ConcurrentModificationException을 피하기 위해 항상 newArrayList를 만들어야하고 나중에 그것에 대해 지식을 얻은 후에 극복 할 것입니다.

자,이 방법은

public static void main (String[] args) { 
    ArrayList<Integer> arr = new ArrayList<Integer>(); 
    arr.add(10); 
    arr.add(15); 
    arr.add(13); 
    arr.add(-5); 
    arr.add(28); 
    combinations(arr, new ArrayList<ArrayList<Integer>>(), 0, 4, 28); 
} 

설명으로 호출해야합니다 : 나는 INT 범위에있는 합계에 맞게 질문의 답변을 일반화했다. BaseList의 모든 조합을 인쇄 할 ArrayList ArrayList를 만들었습니다.

  1. I는 먼저 현재의 구성 요소가 < = 합계 경우 현재 요소 즉 하나의 원소를 함유 ArrayList를 첨가 하였다.
  2. 나머지 모든 ArrayList를 사용하여 각각의 합계를 계산 한 다음 현재 요소를 이전 ArrayList에 추가하는 것이 위의 조건을 충족하는지 확인합니다.
  3. 동시에 새로운 ArrayList를 만들었고 각 ArrayList의 합계를 계산하는 동안 모든 요소를 ​​복사 한 다음 두 번째 사례가 양호하게 유지되면 현재 요소를 임시 ArrayList에 추가 한 다음 임시 ArrayList를 Answer ArrayList의 ArrayList입니다.
  4. 그런 다음 startIndex를 1 씩 증가시켜 재귀를 호출했습니다. 도움이 되길 바랍니다.
+0

정말 대단합니다, 정말 고마워요! 내 것보다 훨씬 나은 해결책. 내가 arraylist의 arraylist를 반환하고 싶다면 어떻게 작동할까요? – Danny

+0

@ 대니 그러나 여기에는 10,10과 같은 결과가 포함되지 않습니다. 나는 접근법을 가지고 있으며 그것에 대한 답을 구하고있다. ArrayList의 ArrayList를 반환하려면 기본 케이스에서 빌드를 시작해야합니다. 기본 경우 arrayList의 크기는 1 또는 0이며 반환 할 수 있습니다. 그런 다음 Arraylist를 사용하여 각 arrayList에 요소를 추가합니다 (조건에 따라 다름). –

+0

@ 대니 upvote하시기 바랍니다 귀하의 문제를 해결하는 경우 허용으로 표시하고 10,10을 포함하여 문제를 해결할 것입니다 답변을 업데이 트합니다. 시간이 걸려요. 나는 나중에 그것을 업데이트 할 것이다. –