Binomialkoeffizient n/k

sserio

Bekanntes Mitglied
Die Aufgabe ist diese hier: https://projekteuler.de/problems/15. Da ich selbst noch in die 11 Klasse gehe kenne ich mich mit Analysis noch nicht so wirklich aus und habe mir daher halt einfach eine Formel aus dem Internet geholt: n!/ k! *(n-k)! . Vllt ist ja hier jemand der Informatik studiert hat und mir sagen kann, ob man in dem obigen (link) Beispiel n und k irgendwie berechnen kann oder sich halt einfach denken kann/ ableiten, dass n=40 ist und k=20 ist, weil bei dem 2mal2 Gitter n=4 und k=2 war. Also mein Problem ist es, dass ich vom schulischen Wissensstand noch gar nicht so weit bin und daher in der Freizeit noch zu blöd für solche Aufgaben bin.
Java:
package ProjectEuler15;

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        System.out.printf("%1$d ", findTheNumber(40, 20));
    }

    public static BigInteger findTheNumber(int n, int k) { //n =40, k=20 in dem Fall
        var nFactorial = BigInteger.ONE;
        var kFactorial = BigInteger.ONE;
        var m = n - k;
        var mFactorial = BigInteger.ONE;
        var result = BigInteger.ZERO;
        for (int i = 1; i <= n; i++) {
            nFactorial = nFactorial.max(nFactorial.multiply(BigInteger.valueOf(i)));
        }
        for (int j = 1; j <= k; j++) {
            kFactorial = kFactorial.max(kFactorial.multiply(BigInteger.valueOf(j)));
        }
        for (int l = 1; l <= m; l++) {
            mFactorial = mFactorial.max(mFactorial.multiply(BigInteger.valueOf(l)));
        }
        result = result.add(nFactorial.divide(kFactorial.multiply(mFactorial)));
        return result;
    }
}
 

mihe7

Top Contributor
Vllt ist ja hier jemand der Informatik studiert hat und mir sagen kann, ob man in dem obigen (link) Beispiel n und k irgendwie berechnen kann oder sich halt einfach denken kann/ ableiten, dass n=40 ist und k=20 ist, weil bei dem 2mal2 Gitter n=4 und k=2 war.
Die Überlegung ist folgendermaßen: wenn Du ein k x k Gitter hast, dann musst Du insgesamt k Bewegungen nach rechts und k Bewegungen nach unten durchführen, um von links oben nach rechts unten zu gelangen. Ganz gleich, welche Reihenfolge Du auch wählst, es sind immer k+k = 2k Bewegungen.

Die Bewegungen werden nacheinander ausgeführt, es gibt also eine Reihenfolge, so dass wir von einer ersten, zweiten, dritten, i-ten Bewegung sprechen können. Oder aber von einer Bewegungsfolge mit 2k Stellen, wobei die i-te Stelle eben die i-te Bewegung bezeichnet.

Um einen Pfad eindeutig anzugeben, genügt es, für k Stellen der Bewegungsfolge eine Rechtsbewegung anzugeben (die dann verbleibenden k Bewegungen sind dann automatisch die nach unten).

Die Anzahl der Pfade entspricht somit der Anzahl der Möglichkeiten, k aus 2k Stellen der Bewegungsfolge auszuwählen. Sprich: "k aus 2k" oder "2k über k"

Wir können das mal kurz an einem 3 x 3 Gitter veranschaulichen. Es sind 3 Bewegungen nach rechts und 3 Bewegungen nach unten erforderlich, insgesamt also 6 Bewegungen.

Die Bewegungsfolge gebe ich mal mit einer Zeichenfolge an, wobei der Bindestrich für "nicht belegt" steht. Am Anfang haben wir also ------ (6 freie Plätze). Wir müssen uns jetzt nur 3 Plätze für die Rechtsbewegung heraussuchen. Beispielsweise könnte man die Plätze 2, 5 und 6 wählen und erhält somit -r--rr. Die leeren Plätze müssen zwangsweise Bewgungen nach unten sein (damit würde sich uruurr als Pfad ergeben, was aber keine weitere Rolle spielt).

Es gibt 6 über 3 Möglichkiten, 3 Plätze aus 6 auszuwählen und das ist nichts anderes als 6! / (3! * (6-3)!) = 6*5*4 / (3*2*1) = 2*5*2 = 20. In einem 3 x 3 Gitter gibt es also 20 Möglichkeiten.
 

sserio

Bekanntes Mitglied
Nebenbemerkung: mit Schulstoff haben die Aufgaben weniger zu tun, i.d.R. sind Tricks und Gesetzmässigkeiten anzuwenden statt brutal durchzurechnen (Bsp. Aufgaben 16 und 20). Der Name "Euler" ist auch nicht zufällig gewählt.
jA, mache das aber auch nur so aus spaß... habe vllt vor Informatik zu studieren
 

Ähnliche Java Themen

Neue Themen


Oben