2013-02-17 7 views
1

면책 조항 : 숙제 문제가 아닙니다. 나는이 퍼즐을 우연히 발견했다 here 그리고 나는 또한 대답을 가지고있다. 그러나 솔루션에 도달하기위한 접근 방식을 이해할 수는 없습니다.이 퍼즐을 다루는 방법?

다윗의 자녀들의 나이의 제품은 자신의 나이의 합의 제곱입니다 : 아래로

퍼즐입니다. 데이비드는 8 명 미만의 자녀를두고 있습니다. 그의 자녀 중 누구도 같은 나이가 아닙니다. 그의 자녀 중 14 세 이상은 없습니다. 그의 자녀들은 모두 2 세 이상입니다. 다윗은 몇 명의 어린이가 있으며, 나이는 몇 살입니까?

대답은 2,4,6,12 번입니다.

프로그래밍 방식으로이 문제를 해결할 수있는 방법을 제안하십시오.

+1

이었다. '1.' 어떤 프로그래밍 언어로 질문에 접근하려고합니까? '2.' 프로그래밍 경험이 있습니까? – bonCodigo

+0

@bonCodigo 네, 2 년의 프로그래밍 경험이 있습니다. C, C++ 및 Java에 능숙합니다. C++로 해봤지만 약간 길어 보입니다. 그래서 Java로 갈 것입니다. 그러나 여전히 스파크/아이디어를 시작할 수 없었습니다. –

+0

그러면 올바른 프로그래밍 언어로 질문을 다시 시도하고 방해가되는 코드를 표시하는 것이 더 나을 것입니다 (또는 주요 로직 스 니펫 일 가능성이 높음). 귀하의 질문 :) – bonCodigo

답변

3

내가 그것을 해결을 자바는 재귀 적 접근법을 사용한다. 먼저 프로그램은 모든 조합을 인쇄 한 다음 마침내 올바른 조합 (지정된 기준과 일치)을 제공합니다.

이 프로그램은 즉시 출력 당신이 질문에서 지정한대로

(2, 4, 6, 12) 

을 제공합니다. 수득

public class Tackle { 
static int[] ages = {2,3,4,5,6,7,8,9,10,11,12,13,14}; // Since the program uses a recursive function, 
static StringBuffer sb = new StringBuffer("");   // the variables are declared as static 
static int x=0,occurances=0; 
static int sum,pdt=1,count=0; 
static String[] instances = new String[100]; 
static void recurse(int a[], int k, int n) throws Exception 
{ 
    if(k==n) // This program obtains various combinations using binary technique 
    { 
     for(int i=0;i<n;i++) 
      if(a[i] == 1){ 
        System.out.print(ages[i]+" "); // Displays all the combinations available    
        sum = sum + ages[i]; 
        pdt = pdt * ages[i]; 
        count++;           
        sb.append(String.valueOf(ages[i]+" ")); 
        } 
        if(Math.pow(sum, 2) == pdt && count<8){  // Checking the criteria 
         instances[occurances++] = sb.toString(); 
        } 

        sb = new StringBuffer(""); 
        count = 0; 
        sum = 0; 
        pdt = 1; 
        System.out.println(""); 
    } 
    else for(int i=0;i<=1;i++) 
    {  
     a[x++] = i; 
     recurse(a,k+1,n); 
     x--; 
    } 
} 

public static void main(String[] args) throws Exception { 
    int[] a = new int[10000]; 
    recurse(a,0,ages.length); 
    if(occurances>0) 
    { 
     System.out.println("No of combinations matching: " + occurances); 
     for(int i=0;i<occurances;i++) 
     System.out.println("The combination of ages is [ " + instances[i] + "]"); 
    } 
    else 
     System.out.println("No combination matches the criteria. "); 
} 
} 

출력 SO 구체적 프로그래밍 질문 .. 이미 상기 링크 로직을 받고 전용된다

[All possible combinations are listed here] 
No of combinations matching: 1 
The combination of ages is [ 2 4 6 12 ] 
+1

자바의 코드는 내가 찾고있는 멋진 코드입니다. 그건 그렇고, 이것은 정말로 도전적인 문제입니다. 당신이 그것을 해결하기 위해 사용했던 접근 방식은 무엇 이었습니까? –

1

연령이 모두 정수라고 지정하지 않았지만, 사실이라고 가정합니다. 그렇다면, 8 명의 아이들 중 그 나이의 가능한 조합은 약 1e9에 불과합니다. 간단히 (for(age1=2; age1<15; age1++) { for(age2=2; age2<15; age2++) { ...) 모두 열거하고 테스트하십시오. 컴퓨터는 스크립트 인터프리터에서도 몇 분 안에 작업을 완료해야합니다.

하드 코딩 "8"루프가 어색하고 연령 목록이 순서에 영향을받지 않기 때문에 최적화가 적용됩니다 ("4와 2"의 자식이 "2와 4") 솔직히 말해서 나는 그게 그만한 가치가 있다고 생각하지 않는다. 추가 단계를 코딩하는 데 소요되는 시간은 런타임에 저장하는 것보다 많은 시간이 소요됩니다.

파이썬에서
+0

쉬운 최적화 : for (age2 = age1 + 1; ...) 등등. – Thomas

+0

안녕하세요 Andy, 1e9 가능한 조합은 무엇을 의미합니까? 그것은 특정 기능을 나타 냅니까? –

+1

1e9 == 1000000000 –

5

(당신이 무엇을 요구하지 않습니다,하지만 당신은 더 알고리즘을 요청중인) : 즉시

import operator 
import itertools 

possible_ages = range(2,15) 

# If the list of ages passed to this function returns true, then this solves the puzzle. 
def valid(ages): 
    product_of_ages = reduce(operator.mul, ages, 1) 
    square_of_sum_of_ages = reduce(operator.add, ages, 0) ** 2 
    return product_of_ages == square_of_sum_of_ages 

for number_of_children in range(1, 9): 
    for ages in itertools.combinations(possible_ages, number_of_children): 
     if valid(ages): 
      print ages 

그리고

인쇄 :

(2, 4, 6, 12) 
+1

와우! 나는 당신의 코드에 정말 놀랐다. 파이썬은 항상 멋진가요? ACM ICPC 나 CodeChef 또는 다른 프로그래밍 콘테스트에서 itertools.combinations() 유형의 함수를 사용할 수 있습니까? 프로그래밍 콘테스트에서 제한된 내장 함수가 아닌가? –

+0

또한 범위 (1, 9) 만 확인했습니다. 나머지 연령대는 어떨까요? 그들은 암시 적으로 포함 시켰습니까? –

+0

어쨌든 고맙습니다 !! –