Отказ от ответственности: это не проблема домашней работы. Я наткнулся на эту загадку Вот и у меня тоже есть ответ. Тем не менее, я не могу найти подход, чтобы прийти к решению.
Головоломка, как указано ниже:
Продукт возрастов детей Давида — это квадрат суммы их возрастов. У Дэвида меньше восьми детей. Ни один из его детей не имеет такого же возраста. Ни одному из его детей не исполнилось 14 лет. Всем его детям не менее двух лет. Сколько детей у Давида и сколько им лет?
Ответ бывает 2,4,6,12.
Пожалуйста, предложите способ решить эту проблему программно.
Я решил это в 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 ]
В 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)
Вы не указываете, что возраст все целые числа, но я собираюсь предположить, что это правда. Если это так, то среди 8 детей существует только около 1-9 возможных комбинаций этих возрастов. Просто перечислить (for(age1=2; age1<15; age1++) { for(age2=2; age2<15; age2++) { ...
) их всех и тестируют. Ваш компьютер должен выполнить эту задачу в течение нескольких минут даже в интерпретаторе сценариев.
Существуют оптимизации, которые необходимо применить, потому что жесткое кодирование циклов «8» неуклюже, а возрастные списки не зависят от порядка (иметь детей с «4 и 2» — то же самое, что и «2 и 4»), но, честно говоря, Я не думаю, что это того стоит. Время, затраченное на кодирование дополнительных шагов, займет больше времени, чем вы сэкономите во время выполнения.