Java Münzen Schleife

attex

Mitglied
Moin Leute,

hab wieder nen kleines Programm geschrieben.
Und zwar soll das Programm die Anzahl an Möglichkeiten angeben mit der verschiedene Münzen zusammen 2€ ergeben. z.B. 1*2€, 2*1€, 2*50ct+1*1€ usw.

Java:
public class muenzen {
 public static void main(String [] args){
 int a=0;
 int b=0;
 int c=0;
 int d=0;
 int e=0;
 int f=0;
 int g=0;
 int h=0;
 
 int anzahl = 0;
 int zaehler = 0;

  for(a=0; a<201; a+=200){
   anzahl += a;
     for(b=0; b<201; b+=100){
	 anzahl += b;
       for(c=0; c<201; c+=50){
	   anzahl += c;
     	 for(d=0; d<201; d+=20){
		 anzahl += d;
          for(e=0; e<201; e+=10){
		  anzahl += e;
            for(f=0; f<201; f+=5){
			anzahl += f;
              for(g=0; g<201; g+=2){
			  anzahl += g; 
               for(h=0; h<201; h++){
			   anzahl += h;
			   if(anzahl==200){
			    zaehler++;
				anzahl = 0;
				break;
      		   }
			   }
			  if(anzahl==200){
			  
			  zaehler++;
			  anzahl = 0;
			  break;
      	      }
            
			  
              }
		    if(anzahl==200){
		    
		    zaehler++;
			anzahl = 0;
		    break;
      	    }
           
		
            }
		  if(anzahl==200){
		  
		  zaehler++;
		  anzahl = 0;
		  break;
          }
        
		  
          }
        if(anzahl==200){
	   
	    zaehler++;
		anzahl = 0;
	    break;
        }
       
	
        }
	   if(anzahl==200){
	  
	   zaehler++;
	   anzahl = 0;
	   break;
       }
      
	   
       }
     if(anzahl==200){
     
     zaehler++;
	 anzahl = 0;
     break;
     }
    
     
	 }
   if(anzahl==200){
   
   zaehler++;
   anzahl = 0;
   break;
   }
   
  
   
   }
   
   System.out.println("Zaehler: " +zaehler);
 }
 
}

Hier mal der Code.
Er gibt mir immer nur den Zaehler der innersten Schleife aus.
Wisst ihr woran das liegen könnte?

Besten Dank schon im Vorraus

Fabi
 
Wenn du Code postest und Hilfe willst, dann kontrolliere wenigesten ob der Code halbwegs lesbar formatiert ist.
Diese zig Leerzeilen und fehlende Einrückungen sind sowas von störend.

Zu deinem Problem: Es gibt eine Variable "zaehler" welche in jeder Schleife bearbeitet wird wenn die Bedingung "anzahl==200" zutrifft.
Am Ende machst du eine Ausgabe und fertig. Was erwartest du dir denn was alles ausgegeben wird? Was wird tatsächlich ausgegeben?

Was kann man sich vorstellen für was a, b, c, d usw. stehen? Etwas erklärung zu deinem Code wäre sinnvoll, da du leider keine sprechenden Namen verwendet hast.
 
Warum nennst du die Variablen dann nicht einfach so das man schon beim Lesen versteht das es sich um die Münzen handelt?

Wie schon oben gesagt:
Du hast eine "zaehler" Variable die in jeder Schleife angepasst wird und nach allen Schleifen wird diese 1 Variable ausgegeben.
Da du aber auch Kombinationen aus mehreren Münzen haben kannst brauchst du auch mehrere "zaehler" Variablen (entsprechend eindeutig benannt).
Und wenn du in einer Schleife dann die "anzahl" == 200 erreichst, gibst du alle diese Zähler aus. Und danach kannst die Schleifen noch soweit optimieren, das wenn die Anzahl > 200 ist, keine weiteren Schleifendurchläufe ausgeführt werdnen.
 
Das erinnert mich an den Rucksack-Algorithmus. Man hat verschiedene Gegenstände, die man in einen Rucksack stecken will. Bei dir sind die Gegenstände Münzen.
 
Ich habe mal begonnen, die Grundstruktur aufzubauen. Allerdings hab ich das noch nicht getestet, sind sicher noch viele Fehler drin. Mir fehlt jetzt die Zeit, das noch weiter auszuprogrammieren.

Java:
class Muenzkombinationen
{
   private void recZaehler(int index, int differenz, int[] muenzen)
   {
      int muenze = this.muenzen[index];
      if(index == this.muenzen.length - 1) // Abbruchbedingung für rekursive Aufrufe
      {
         if(differenz < muenze) 
         {
            return 0;
         }
         return this.muenzen[index];
      }
      else
      {
         if(differenz < muenze)
         {
            return recZaehler(index + 1, differenz, muenzen); // Links weiter in den "Münze muenze[index] nicht nehmen"-Zweig.
         }
         else
         {
            return Math.max
            (
               this.recZaehler(index + 1, differenz, muenzen),         // Links weiter in den "Münze muenze[index] nicht nehmen"-Zweig.
               this.recZaehler(index + 1, differenz - muenze, muenzen) // Rechts weiter in den "Münze muenze[index] nehmen"-Zweig.
            );
         }
      }
   }
   public void zaehler(int betrag, int[] muenzen)
   {
      return this.recZaehler(0, betrag, muenzen);
   }
   public static void main(String[] args)
   {
      int betrag = 500; // in cent
      int[] muenzen = [10, 10, 20, 20, 20, 50, 50, 100, 100, 100, 100, 200];
      int summe = this.zaehler(betrag, muenzen);
      System.out.println(summe);
   }
}

Sobald das Programm fehlerfrei läuft, müssen die Münzen "nur" noch gesammelt werden.
 
Zuletzt bearbeitet:
Dann schreibe doch die Lösung bitte in diesen Thread!
Es wird wieder Leute geben die am gleichen Problem sitzen, da ist es praktisch schon auf einen Thread mit einer Lösung zu verweisen.
 
Schön, dass du das schon gelöst hast, sonst hätte ich mich jetzt weiter hingesetzt. Wie schaut denn deine Lösungsvariante aus?
 

Neue Themen


Zurück
Oben