-2

免責事項:これは宿題の問題ではありません。私はここでこのパズルに出くわしました、そして私も答えを持っています。しかし、私は解決策に到達するためのアプローチを理解することができません。

パズルは以下のとおりです。

デビッドの子供たちの年齢の積は、彼らの年齢の合計の二乗です。デビッドの子供は8人未満です。彼の子供は誰も同じ年齢ではありません。彼の子供は誰も14歳以上ではありません。彼の子供たちは全員少なくとも2歳です。ダビデには何人の子供がいますか、そして彼らの年齢は何歳ですか?

答えはたまたま2,4,6,12です。

この問題をプログラムで解決する方法を提案してください。

4

3 に答える 3

5

Pythonの場合(これはあなたが尋ねたものではありませんが、あなたはもっとアルゴリズムを求めています):

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)
于 2013-02-17T21:00:29.667 に答える
1

年齢がすべて整数であると指定することはありませんが、それは本当だと思います。もしそうなら、8人の子供の間でそれらの年齢の約1e9の可能な組み合わせだけがあります。それらすべてを列挙(for(age1=2; age1<15; age1++) { for(age2=2; age2<15; age2++) { ...)してテストするだけです。スクリプトインタープリターを使用している場合でも、コンピューターは数分以内にそのタスクを完了する必要があります。

「8」ループのハードコーディングは不器用であり、年齢リストは順序に依存しないため(「4と2」の子を持つことは「2と4」と同じです)、適用する最適化がありますが、率直に言ってここではそれだけの価値はないと思います。追加の手順のコーディングにかかる​​時間は、実行時に節約するよりも時間がかかります。

于 2013-02-17T20:45:55.237 に答える
0

再帰的アプローチを使用してJavaで解決しました。最初にプログラムはすべての組み合わせを出力し、最後に正しい組み合わせ(指定された基準に一致する)を提供します。

このプログラムは即座に出力を提供します

(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. ");
}
}

得られた出力は

[All possible combinations are listed here]
No of combinations matching: 1
The combination of ages is [ 2 4 6 12 ]
于 2013-02-17T21:16:52.963 に答える