Я ученик средней школы Computer Science, и сегодня мне была задана проблема:
Описание программы: среди игроков в кости есть мнение, что в бросая три кубика десять легче получить, чем девять. Вы можете написать программа, которая доказывает или опровергает это убеждение?
Попросите компьютер вычислить все возможные способы, которыми могут быть три кости брошенный: 1 + 1 + 1, 1 + 1 + 2, 1 + 1 + 3 и т.д. Добавьте каждый из этих возможности и посмотреть, сколько в итоге дают девять и сколько дайте десять. Если больше дать десять, то вера доказана.
Я быстро разработал решение грубой силы, как таковое
int sum,tens,nines;
tens=nines=0;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
for(int k=1;k<=6;k++){
sum=i+j+k;
//Ternary operators are fun!
tens+=((sum==10)?1:0);
nines+=((sum==9)?1:0);
}
}
}
System.out.println("There are "+tens+" ways to roll a 10");
System.out.println("There are "+nines+" ways to roll a 9");
Что работает отлично, и решение грубой силы - это то, что учитель хотел, чтобы мы сделали. Тем не менее, он не масштабируется, и я пытаюсь найти способ сделать алгоритм, который может вычислить количество способов катить n кости, чтобы получить конкретное число. Поэтому я начал генерировать количество способов получить каждую сумму с помощью n кости. С 1 умирают, очевидно, 1 решение для каждого. Затем я вычислил с помощью грубой силы комбинации с 2 и 3 кубиками. Это два:
Есть 1 способ бросить 2
Есть 2 способа бросить 3
Есть 3 способа бросить 4
Есть 4 способа бросить 5
Есть 5 способов бросить 6
Есть 6 способов бросить 7
Есть 5 способов бросить 8
Есть 4 способа бросить 9
Есть 3 способа бросить 10
Есть 2 способа бросить 11
Есть 1 способ бросить 12
Что выглядит достаточно просто; его можно вычислить с помощью простой линейной функции абсолютного значения. Но потом все становится сложнее. С 3:
Есть 1 способ бросить 3
Есть 3 способа бросить 4
Есть 6 способов бросить 5
Есть 10 способов бросить 6
Есть 15 способов бросить 7
Есть 21 способ бросить 8
Есть 25 способов бросить 9
Есть 27 способов бросить 10
Есть 27 способов бросить 11
Есть 25 способов бросить 12
Есть 21 способ бросить 13
Есть 15 способов бросить 14
Есть 10 способов бросить 15
Есть 6 способов бросить 16
Есть 3 способа бросить 17
Есть 1 способ бросить 18
Поэтому я смотрю на это, и я думаю: Cool, Треугольные цифры! Тем не менее, тогда я замечаю эти досадные 25 и 27 лет. Таким образом, это, очевидно, не треугольные числа, а еще некоторое полиномиальное разложение, так как оно симметрично.
Поэтому я беру в Google, и я сталкиваюсь с этой страницей, в которой подробно описывается, как это сделать с помощью математики. Довольно легко (хотя и долго) найти это, используя повторяющиеся производные или расширения, но было бы гораздо сложнее запрограммировать это для меня. Я не совсем понял второй и третий ответы, так как раньше я не встречал этих обозначений или этих концепций в своих математических исследованиях. Может кто-нибудь объяснить, как я могу написать программу для этого или объяснить решения, приведенные на этой странице, для моего собственного понимания комбинаторики?
EDIT: Я ищу математический способ решить эту проблему, которая дает точное теоретическое число, а не путем моделирования кубиков