package de.sebhn.algorithm.excercise3;

import java.math.BigInteger;
import java.util.HashMap;

public class fibonacci {
  static int betrag[] = {1, 3, 7, 31, 47};
  static int n = betrag.length; // Anzahl Muenzen

  static BigInteger w[][]; // Tabelle

  public static void main(String[] args) {
    for (int i = 0; i < 37; i++) {
      int g = F(i).intValue(); // g lesen
      w = new BigInteger[g + 1][n]; // w dimensionieren
      System.out.println(
          "Den Betrag " + g + " kann man auf " + w(g, n - 1) + " verschiedene Arten wecheln.");
    }
  }

  static HashMap<Integer, BigInteger> F = new HashMap<>(); // dynamic table

  public static BigInteger F(int n) { // method
    if (n <= 1) {
      return BigInteger.valueOf(n);
    } // base case
    BigInteger m = F.get(n); // lookup
    if (m != null)
      return m; // sucessful
    m = F(n - 1).add(F(n - 2)); // recursion
    F.put(n, m); // store
    return m; // finish
  }


  static BigInteger w(int g, int i) { // Methode
    return g < 0 ? BigInteger.ZERO
        : i == 0 ? (g % betrag[0] == 0 ? BigInteger.ONE : BigInteger.ZERO)
            : !w[g][i].toString().equals("0") ? w[g][i]
                : (w[g][i] = w(g, i - 1).add(w(g - betrag[i], i)));
  }
}

@@ -377,24 +377,53 @@
 // g lesen%0D%0A
+      int gPlusOne = g + 1;%0D%0A
       w = ne
@@ -436,20 +436,23 @@
 nteger%5Bg
- + 1
+PlusOne
 %5D%5Bn%5D; //
@@ -466,24 +466,165 @@
 nsionieren%0D%0A
+      for (int j = 0; j %3C gPlusOne; j++) %7B%0D%0A        for (int l = 0; l %3C n; l++) %7B%0D%0A          w%5Bj%5D%5Bl%5D = BigInteger.ZERO;%0D%0A        %7D%0D%0A      %7D%0D%0A
       System

fill biginteger array with zero