Mission To Moon

Status
Nicht offen für weitere Antworten.

zeroCool

Mitglied
Guten Tag,

Also, folgende sehr knifflige (und natürlich völlig fiktive ;-)) Aufgabe:

- Mondmission läuft schief; Spaceshuttle stürzt ab
- Ziel (Basislager) um 500 km verfehlt
- Astronaut muss Basislager zu Fuß erreichen; er benötigt aber dringend Nahrung
- 450 Dosen Nahrung stehen zur Verfügung
- mit einer Dose kommt der Astronaut 15 km weit
- er kann aber nur 12 Dosen gleichzeitig tragen

Welche Möglichkeit gibt es, das Ziel mit gegebener Dosenanzahl zu erreichen? Es soll die Rekursion genutzt werden.

Meine erste Idee war es, 12 Dosen zu nehmen. Damit 15 km zu laufen und dann 10 Dosen abzulegen (2 werden jeweils für Hin- und Rückweg benötigt). Zurückgehen und alles wiederholen, bis das komplette Lager bei Kilometer 15 ist. Danach das selbe Spielchen von KM 15 nach KM 30, usw.

Leider zeigt mein Programm, dass es nicht reicht, da zu viel verbraucht wird:

Code:
public class Mission {

    public static void mission(double dosen, double strecke) {
        double verbrauch = 0;
        double lager = 0;
        double gesamt = 0;
        if (strecke > 0) {
            while (gesamt < dosen) {
                verbrauch = verbrauch + 2;
                lager = lager + 10;
                gesamt = verbrauch + lager;
            }
            lager = lager - 10;
            verbrauch = verbrauch - 2;
            gesamt = verbrauch + lager;
            strecke = strecke - 15;
            mission(lager, strecke);
        }
        System.out.println("Gesamter Dosenverbrauch: " + gesamt
                + "\t Reststrecke: " + strecke + "\t Dosen im Zwischelager: "
                + lager);
    }

    public static void main(String[] args) {
        mission(450, 500);

    }

}

Habt ihr eine Idee, mit welchem Algorithmus das Problem zu lösen wäre? Mir ist irgendwienichts mehr eingefallen...
Auch andere Varianten, wie 45 km laufen, 6 Dosen ablegen und 6 verbrauchen waren erfolglos.


Wäre toll, wenn ihr mir helfen könntet!

Grüße,
zero
 

Bleiglanz

Gesperrter Benutzer
die idee ist doch nicht schlecht, ich habs jetzt nicht ausgerechnet

hast du auch bedacht, dass der gute Mann mit 12 Dosen die letzten 180 km am Stück durchwandern kann?

d.h. es reicht, wenn er mit deiner Methode 12 Dosen zu Kilometer 320 schaffen kann?

also es reicht, wenn er mit deiner Methode 15 Dosen zu Kilometer 305 schaffen kann (er muss ja beim letzen mal nur einmal gehen!)
 

Mag1c

Top Contributor
Hi,

also die Aufgabe klingt echt interessant

hier mal so meine Ideen dazu:

ich gehe mal davon aus, daß immer in 15km-Schritten gelaufen wird. Wenn man den Algorithmus erstmal hat, kann man die Strittweite noch veringern (ich komme ja mit einer Dose z.B. 7,5 km weit und wieder zurück)

Ich brauche ein lager[] Array, welches mir anzeigt, wo welche Dosen lagern. lager[0] = 450

Code:
gehelos ( pos, dosen, wegstrecke ) {
    lager[pos] = lager[pos] - dosen
    verbrauch = abs(wegstrecke) / 15
    neuepos = pos + wegstrecke
    lager[neuepos] = lager[neuepos] + dosen - verbrauch
    if ( neuepos >= ziel )
        print "bin da"
    else
        for ( i=1; i <= 12 && i <= lager[neuepos]; i++ ) {
            gehelos(neuepos, i, 15)
            gehelos(neuepos, i, -15)
        }
}

so. das erstmal als Denkanstoß. Viel Spaß beim basteln :)

Damit du am Ende auch weißt, wie du angekommen bist, müßtest du in der Rekursion
noch eine Liste mitführen, in welcher du die Bewegungs-Historie aufzeichnest
z.b. liste.add("gehe von "+pos+" nach "+neuepos+" mit "+dosen+" Dosen")

Gruß
Mag1c
 
G

Guest

Gast
ach ja, das hatte ich vergessen zu sagen. danke für den hinweis!

leider reicht es trotzdem nicht.
bei einem verhältnis von 2 (verbrauch) / 10 (zwischenlager) stehen nach 195 km nur noch 10 Dosen zu Verfügung.
Optimal ist nach meiner Variante das Verhältnis 6 / 6 und 45 km Teilstrecke. Dabei bleiben nach 225 km noch 6 Dosen.
Bis KM 320 bin ich leider noch nie gekommen... :?

Irgendwie habe ich das Gefühl, dass meine Idee nicht ganz richtig ist. Es muss noch eine andere Möglichkeit geben...
 

zeroCool

Mitglied
Anonymous hat gesagt.:
ach ja, das hatte ich vergessen zu sagen. danke für den hinweis!

leider reicht es trotzdem nicht.
bei einem verhältnis von 2 (verbrauch) / 10 (zwischenlager) stehen nach 195 km nur noch 10 Dosen zu Verfügung.
Optimal ist nach meiner Variante das Verhältnis 6 / 6 und 45 km Teilstrecke. Dabei bleiben nach 225 km noch 6 Dosen.
Bis KM 320 bin ich leider noch nie gekommen... :?

Irgendwie habe ich das Gefühl, dass meine Idee nicht ganz richtig ist. Es muss noch eine andere Möglichkeit geben...

oh, ich war ja gar nicht eingeloggt :oops:

wie hilft mir das mit dem positions-array denn weiter? liegt es nicht am falschen algorithmus?
 

Bleiglanz

Gesperrter Benutzer
irgendwie musst du wohl die restdosen auch noch mitnehmen, ich glaube das fehlt bei dir

du ziehst immer 12 ab (bis du bei weniger als 12 bist) und zum schluss kannst du ja die restlichen noch "rübertragen"
 

Oni

Top Contributor
Ich habe das berücksichtig, aber es reicht trotzdem nicht. oder habe ich hier einen fehler

Code:
public class Dosen{

     int dosen = 0;
     int strecke = 0;
     int hauptLager = 0;
     int zwischenLager = 0;
     int verbrauch = 0;
     boolean ziel = true;
     int etappe = 0;

     public Dosen(int dosen){
     	this.dosen = dosen;
          hauptLager = dosen;
     }

	public static void main(String[] args){
     	Dosen d = new Dosen(450);
          d.start();
     }

     public void start(){
     	// wird ausgeführt bis alles verbraucht ist oder das Ziel erreicht
     	while((verbrauch < dosen) && (ziel)){
          	while (hauptLager > 11){
          		zwischenLager = zwischenLager + 10;
               	hauptLager = hauptLager - 12;
               	verbrauch = verbrauch + 2;
               }

               // wenn noch ein rest kleiner 12 da ist
               if(hauptLager > 0){
               	verbrauch = verbrauch + 1;
                    hauptLager = hauptLager - 1;
                    zwischenLager = zwischenLager + hauptLager;
               }

               // zwischenlager als neues HauptLager
               hauptLager = zwischenLager;
               zwischenLager = 0;
               strecke = strecke + 15;
          	etappe++;


               if(strecke >= 500){
               	System.out.println("Ziel");
                    ziel = false;
               }
               else{
               	System.out.println();
               	System.out.println("#####" + "Etappe Nr. " + etappe + "#####");
               	System.out.println("Unterwegs bei km: " + strecke);
                    System.out.println("bisher verbraucht: " + verbrauch);
                    System.out.println("neues Hauptlager = " + hauptLager);
               }
          }
     }
}
 
B

Beni

Gast
zeroCool hat gesagt.:
Meine erste Idee war es, 12 Dosen zu nehmen. Damit 15 km zu laufen und dann 10 Dosen abzulegen (2 werden jeweils für Hin- und Rückweg benötigt). Zurückgehen und alles wiederholen, bis das komplette Lager bei Kilometer 15 ist. Danach das selbe Spielchen von KM 15 nach KM 30, usw.
Hm, ich habe genau dasselbe gedacht und programmiert. Bei mir gings?

Code:
int km = 0;
        int dosen = 450;
        
        // Unter der Annahme, dass man zuerst isst, dann läuft
        while( dosen > 0 && km < 500 ){
            System.out.println( "km: " + km + ", dosen: " + dosen );
            km += 15;
            
            // Anzahl Dosen am alten Standort
            int base = dosen;
            
            // Anzahl Dosen beim neuen Standort.
            dosen = 0;
            
            while( base > 0 ){
                // maximal 12 können bewegt werden, 1 muss gegessen werden.
                // zusätzlich können nicht mehr als "base" verbliebene Dosen
                // genommen werden.
                int move = Math.min( base, 13 );
                
                // Dosen werden entfernt
                base -= move;
                
                // Dosen werden 15 km weiter abgelegt, eine wurde gegessen
                dosen += move-1;
                
                // falls noch Dosen am alten Standort sind zurückgehen. 
                if( base > 0 )
                    dosen -= 1;
            }
        }
 
B

Beni

Gast
Ah, ich sehe den Unterschied: mein Astronaut isst die erste Dose, bevor er die anderen 12 um 15 km bewegt, dann isst er die zweite Dose um zurückzulaufen.
Deiner hingegen isst die beiden Dosen nachdem er die ersten 12 bewegt hat.
Sie machen praktisch dasselbe, nur zu anderen Zeiten. Das hat aber den Effekt, dass mein Astronaut mehr Dosen umlagern kann (etwa 11 pro Marsch, während deiner nur etwa 10 bewegt).
 

zeroCool

Mitglied
ah, alles klar. verstehe!

wie kann ich das jetzt in meinen code mit einbinden? muss ja schließlich rekursion benutzen.. :?
 
B

Beni

Gast
Also wo man da Rekursion benutzen sollte...

Du könntest ja diese Bewegung, 15 km Dosen weitertragen, in eine Methode auslagern, welche sich selbst aufruft, sollten noch Dosen im Basislager übrig sein.
 

zeroCool

Mitglied
Ist eine Möglichkeit.

Aber hast du vielleicht auch noch eine Idee, wie ich in meinen Code (siehe oben) hinzufüge, dass er erste eine Dose "verdrückt" und dann die 12 km geht, um dann wieder eine leer zu machen?

Und gibt es vielleicht noch eine effizientere Variante, als 15 km zu laufen? Also eine, wo mehr Dosen übrig bleiben?
 

Bleiglanz

Gesperrter Benutzer
Code:
	public static void mission(int links, int strecke, int rechts) {
//		if(rechts==0)
//		System.out
//		.println("Aufgabe: schaffe es mit " + links + " Dosen  " + (strecke) + "km weit"); 

		if (strecke < 0) return;
		if (links > 13) {
			mission(links - 13, strecke, rechts + 11);
		} else if (links > 0) {
			mission(0, strecke, rechts + links - 1);
		} else {
			mission(rechts, strecke - 15, 0);
		}
	}

	public static void main(String[] args) {
		mission(450, 500, 0);
	}
kann es sein, dass er noch 10 km weiter kommt? oder is da noch ein fehler drin
 

Mag1c

Top Contributor
Hi,

also mein Ansatz von oben mag funktionieren, ich weiß es nicht, es dauert einfach viel zu lange.

mit einem anderen Ansatz komme ich nun 480 KM weit. :(

Code:
   private void algo2() {
        mission(0, 450);
        System.out.println("########## Ende");
    }

    private boolean mission (int pos, int dosen) {
        if (pos >= 480) {
            System.out.println("########## Bin da");
            return true;
        }
        int transfer = 0;
        int verbrauch = 0; // nur zum Anzeigen
        while (dosen > 0) {
            transfer = transfer + (dosen > 12 ? 12 : dosen); // Transfermenge erhöht sich um max 12
            dosen = dosen - (dosen > 12 ? 12 : dosen);
            transfer--; // Verbrauch hin
            verbrauch++;
            if (mission(pos + 15, transfer)) {
                System.out.println("########## [" + pos + "]=" + (dosen + transfer + verbrauch) + " -> [" + (pos + 15)
                        + "]=" + transfer + ", Verbrauch=" + verbrauch + ", Rest[" + pos + "]=" + dosen);
                return true;
            }
            transfer--; // Verbrauch zurück
            verbrauch++;
        }
        return false;
    }

D.h. mit der Methode "ich laufe x mal hin und her um n Dosen 15 KM weiterzutransportieren"
wird demnach nicht funktionieren (wenn ich keinen Fehler drin habe).

da ist das Ergebnis für 480, bei 500 kommt kein Ergebnis:
Code:
########## Bin da
########## [465]=1 -> [480]=0, Verbrauch=1, Rest[465]=0
########## [450]=2 -> [465]=1, Verbrauch=1, Rest[450]=0
########## [435]=3 -> [450]=2, Verbrauch=1, Rest[435]=0
########## [420]=4 -> [435]=3, Verbrauch=1, Rest[420]=0
########## [405]=5 -> [420]=4, Verbrauch=1, Rest[405]=0
########## [390]=6 -> [405]=5, Verbrauch=1, Rest[390]=0
########## [375]=7 -> [390]=6, Verbrauch=1, Rest[375]=0
########## [360]=8 -> [375]=7, Verbrauch=1, Rest[360]=0
########## [345]=9 -> [360]=8, Verbrauch=1, Rest[345]=0
########## [330]=10 -> [345]=9, Verbrauch=1, Rest[330]=0
########## [315]=11 -> [330]=10, Verbrauch=1, Rest[315]=0
########## [300]=12 -> [315]=11, Verbrauch=1, Rest[300]=0
########## [285]=15 -> [300]=12, Verbrauch=3, Rest[285]=0
########## [270]=18 -> [285]=15, Verbrauch=3, Rest[270]=0
########## [255]=21 -> [270]=18, Verbrauch=3, Rest[255]=0
########## [240]=24 -> [255]=21, Verbrauch=3, Rest[240]=0
########## [225]=29 -> [240]=24, Verbrauch=5, Rest[225]=0
########## [210]=34 -> [225]=29, Verbrauch=5, Rest[210]=0
########## [195]=41 -> [210]=34, Verbrauch=7, Rest[195]=0
########## [180]=48 -> [195]=41, Verbrauch=7, Rest[180]=0
########## [165]=57 -> [180]=48, Verbrauch=9, Rest[165]=0
########## [150]=68 -> [165]=57, Verbrauch=11, Rest[150]=0
########## [135]=81 -> [150]=68, Verbrauch=13, Rest[135]=0
########## [120]=96 -> [135]=81, Verbrauch=15, Rest[120]=0
########## [105]=115 -> [120]=96, Verbrauch=19, Rest[105]=0
########## [90]=138 -> [105]=115, Verbrauch=23, Rest[90]=0
########## [75]=165 -> [90]=138, Verbrauch=27, Rest[75]=0
########## [60]=198 -> [75]=165, Verbrauch=33, Rest[60]=0
########## [45]=237 -> [60]=198, Verbrauch=39, Rest[45]=0
########## [30]=284 -> [45]=237, Verbrauch=47, Rest[30]=0
########## [15]=341 -> [30]=284, Verbrauch=57, Rest[15]=0
########## [0]=450 -> [15]=341, Verbrauch=67, Rest[0]=42
########## Ende

Gruß
Mag1c
 

zeroCool

Mitglied
Ok, so richtig funktionierts bei keinem, oder?
Vielleicht sollte man nicht das gesamte Kontingent von einem Punkt zum nächsten transportieren, sondern vielmehr erstmal auf mehreren Punkten ein paar ablegen.

Wenn jetzt bei 15 km 2 Dosen liegen, bei 30 zwei, usw. , kann man doch 12 Dosen zum Punkt x tragen, indem man jeweils auf dem Hin- und Rückweg eine Dose pro Punkt verbraucht, aber eben nicht mitnehmen muss.
versteht ihr?



------15--------30--------45--------60---------75-------90 <-- Strecke
-------2---------2----------2----------2----------2--------0 <-- Zwischelager


Person transportiert 12 Dosen (Hin- und Rückweg):

------15--------30--------45--------60---------75-------90 <-- Strecke
-------0---------0----------0----------0----------0--------12 <-- Zwischelager

Bin mir nicht sicher, ob das Sinn macht, aber ihr werdet mich schon verhauen, wenn nicht... :wink: :bahnhof:
 
B

Beni

Gast
Also da ich auf dasselbe wie Bleiglanz komme (10 km Überschuss), und ich gelernt habe, dass Bleiglanz selten was falsch macht, doch:
Ok, so richtig funktionierts bei keinem, oder?
es funktioniert.

Bzw, falls es nicht funktioniert, müsste mir schon jemand erklären, was an unseren Resultaten falsch ist.
 

Nova

Bekanntes Mitglied
Hallo,

@Beni:
Wenn ich das richtig sehe berücksichtigst du nicht das er auf dem Rückweg auch was essen muss! Du berechnest immer nur den Verbrauch für den Hinweg!


Ich habe euren Code nur kurz überflogen und da ich zuerst auch keine Lösung gefunden habe hab ich mir ein Programm geschrieben welches es einfach ausprobiert in Schritten von je 1km.
Demnach ist es lösbar für:
13km Schritte: 533 km
14km Schritte: 574km (Bestmarke!)
20km Schritte: 520km
22km Schritte: 506km
28km Schritte: 504km
29km Schritte: 522km

Die Aufgabe ist ganz schön fies weil mans zuerst mit 15km und 30km versucht und es damit nicht klappt, aber mit 14km und 29km. (Bei 15km kommt man auf 495km und bei 30km auf 480km.)


Code:
Code:
public class Astronaut{
	
	private int dosen = 450, dosen_neu = 0;
	private double distance = 500.0;
	private final double VALUE = 15;
	private double imMagen = 0.0;
	
	public static void main(String[]args){
		for (int s = 1; s <= 100; s += 1){
		    new Astronaut(s);
		}
	}
	
	public Astronaut(int s){
		while (dosen > 0){
			int count = 0;
			while (true){
				count++;
				geheHin(s);
				if ((2*s/VALUE) < dosen){
					geheZuruck(s);
				} else {
					break;
				}
			}
			distance -= s;
			dosen = dosen_neu;
			dosen_neu = 0;
		}
		System.out.println(s + ": " + (500-distance));
	}
	
	public void geheHin(int s){
		int d; // Anzahl Dosen die der Astronaut dabei hat
		if (imMagen < 0.5){ // wenn Magen weniger als halbvoll dann essen
			imMagen = 1.0;
			dosen -= 1;
		}
		if (dosen < 12){
			d = dosen;
		} else {
			d = 12;
		}
		dosen -= d;
		
		double temp = s/VALUE; // Verbrauch
		d -= (int)temp;
		double temp2 = temp-(int)temp;
		imMagen -= temp2;
		
		dosen_neu += d; // Dosen an neuer Position ablegen
	}
	
	public void geheZuruck(int s){
		double temp = s/VALUE; // Verbrauch
		if (temp <= imMagen){
			imMagen -= temp;
			temp = 0;
		} else {
			temp -= imMagen;
			imMagen = 0;
			double temp2 = temp-(int)temp;
			if (temp2 > 0.0){
				imMagen = temp2;
				dosen_neu -= 1; // für Rückweg abziehen
			}
			dosen_neu -= (int)temp; // für Rückweg abziehen
		}
	}	
}


mfg
Christian
 
B

Beni

Gast
Nova hat gesagt.:
@Beni:
Wenn ich das richtig sehe berücksichtigst du nicht das er auf dem Rückweg auch was essen muss! Du berechnest immer nur den Verbrauch für den Hinweg!

Hm:
Code:
                // Dosen werden 15 km weiter abgelegt, eine wurde gegessen
                dosen += move-1;
               
                // falls noch Dosen am alten Standort sind zurückgehen.
                if( base > 0 )
                    dosen -= 1;
Also -1-1 macht bei mir immernoch -2 (genug für Hin- und Rückweg).

Ich versuche dein Code mal zu verstehen, aber er kommt mir grausam kompliziert vor.
 

zeroCool

Mitglied
wow, das sieht ziemlich genial aus. allerdings sehe ich ehrlich gesagt nicht ganz durch... :roll:

kannst du das vielleicht noch so umschreiben, dass die 14-km-schritte-version durchlaufen wird und dabei alle einzelschritte ausgegeben werden? am besten rekursiv, wenn das irgendwie möglich ist...

auf jeden fall bin ich euch wahnsinnig dankbar! ihr habt mir sehr geholfen!!
 
B

Beni

Gast
So, dein Code macht für 15km-Schritte dasselbe wie Bleiglanz und mein Code.
Du solltest dir mal die Magenfüllung angucken, wenn der Austronaut die 495km zurückgelegt hat: er hat noch Reserven für weitere 15 km.

kannst du das vielleicht noch so umschreiben, dass die 14-km-schritte-version durchlaufen wird und dabei alle einzelschritte ausgegeben werden? am besten rekursiv, wenn das irgendwie möglich ist...
Guck dir Bleiglanzes Version an :wink:
 

zeroCool

Mitglied
ja nee klar! es geht mir ja um die 14km. denn ich brauch unbedingt ein ergebnis, bei dem mehrere dosen übrig bleiben, bzw. eine viel weitere strecke als 500 km zurückgelegt wird. und bei 14 km ist ja laut novas code das maximum erreicht...

so ähnlich müsste es doch gehen, oder?

Code:
double km = 0; 
        double dosen = 450; 
        
        // Unter der Annahme, dass man zuerst isst, dann läuft 
        while( dosen > 0 && km < 500 ){ 
            System.out.println( "km: " + km + ", dosen: " + dosen ); 
            km += 14; 
            
            // Anzahl Dosen am alten Standort 
            double base = dosen; 
            
            // Anzahl Dosen beim neuen Standort. 
            dosen = 0; 
            
            while( base > 0 ){ 
                // maximal 12 können bewegt werden, 1 muss gegessen werden. 
                // zusätzlich können nicht mehr als "base" verbliebene Dosen 
                // genommen werden. 
                double move = Math.min( base, 13 ); 
                
                // Dosen werden entfernt 
                base -= move; 
                
                // Dosen werden 15 km (diesmal ja 14) weiter abgelegt, eine wurde gegessen 
                dosen += move-(14/15); 
                
                // falls noch Dosen am alten Standort sind zurückgehen. 
                if( base > 0 ) 
                    dosen -= (14/15); 
            } 
        }

edit: naja, oder auch nicht...? :bahnhof:
 

Oni

Top Contributor
moin,

@Nova kannst deinen code nochmal erklären? ich blick den irgendwie nicht.

ich habe meine code jetzt so umgebaut (wie beni es gesagt hat), das der astronaut eine dose vor und eine nach dem transport ißt und komme bei 15km schritten bis km 510 und bei 14km schritten komme ich bis km 505.

Code:
public class Dosen{

     int dosen = 450;
     int strecke = 0;
     double hauptLager = 0.0;
     double zwischenLager = 0.0;
     double verbrauch = 0.0;
     boolean ziel = true;
     int etappe = 0;

     public Dosen(){
          hauptLager = dosen;
     }

	public static void main(String[] args){
     	Dosen d = new Dosen();
          d.start();
     }

     public void start(){
     	// wird ausgeführt bis alles verbraucht ist oder das Ziel erreicht
     	while((verbrauch < dosen) && (ziel)){
          	while (hauptLager > 13){
                    // er ißt eine Dose für den hinweg
                    hauptLager -= (15.0/15.0); //(14.0/15.0);

                    // er nimmt 12 Dosen aus dem Hauptlager
               	hauptLager -= 12;

                    // die 12 Dosen liefert er ins ziwschenlager
                    zwischenLager += 12;

                    // er ißt eine Dose für den rückweg
                    zwischenLager -= (15.0/15.0); //(14.0/15.0);

                    // der verbrauch für die aktion
               	verbrauch += 2 * (15.0/15.0); //(14.0/15.0);
               }

               // wenn noch ein rest kleiner 13 da ist
               if(hauptLager > 0){
               	verbrauch += (15.0/15.0); //(14.0/15.0);
                    hauptLager -= (15.0/15.0); //(14.0/15.0);
                    zwischenLager += hauptLager;
               }

               // zwischenlager als neues HauptLager
               hauptLager = zwischenLager;
               zwischenLager = 0;
               strecke = strecke + 15;  //14
          	etappe++;


               if(strecke >= 500){
                    System.out.println("#####" + "Etappe Nr. " + etappe + "#####");
                    System.out.println("bisher verbraucht: " + verbrauch);
                    System.out.println("neues Hauptlager = " + hauptLager);
               	System.out.println("Ziel ereicht bei km " + strecke );
                    ziel = false;
               }
               else{
               	System.out.println();
               	System.out.println("#####" + "Etappe Nr. " + etappe + "#####");
               	System.out.println("Unterwegs bei km: " + strecke);
                    System.out.println("bisher verbraucht: " + verbrauch);
                    System.out.println("neues Hauptlager = " + hauptLager);
               }
          }
     }
}
 

Mag1c

Top Contributor
Moin,

@Nova:
deine Lösung sieht ja schon ganz gut aus. Aber ich glaube, da steckt noch ein Fehler drin.
Hab das mal am Bsp. s=14 gecheckt. Nach dem ersten geheHin() hat er 1/15 im Magen, das ist ok.
Wenn er jetzt zurückgeht, hat er 13/15 im Magen, er müsste aber 2/15 im Magen haben: 1/15 + 1(Dose) - 14/15(Verbrauch).
Wenn ich nun in geheZurueck "imMagen = 1-temp2;" ensetze, kommt er garnicht mehr über 500 KM !?

Gruß
Mag1c
 

Bleiglanz

Gesperrter Benutzer
nochmal meine Lösung
Code:
public class Mission {

	public static void mission(int dosenAmStart, int strecke, int depotBei15) {

		System.out.print("Aufgabe: schaffe es mit " + dosenAmStart + " Dosen  " + (strecke) + "km weit"); 
		System.out.println(" (Depot: "+depotBei15+")");  
		if (strecke < 0) return;
		if (dosenAmStart > 13) {
			// bei mehr als 13:
			// iss eine, trage 12 ins depot, iss eine und gehe leer zurück
			// also sind wir wieder am Ausgangspunkt, haben aber 
			// 13 verbraucht, im depot sind 11 dazugekommen und wir
			// können rekursiv weitermachen
			mission(dosenAmStart - 13, strecke, depotBei15 + 11);
			
		} else if (dosenAmStart > 0) {
			// wenn mehr als 0 und <= 13:
			// iss eine und trage die verbliebenen (<=12) ins depot
			// dann sind wir im depot, haben keine mehr am Start und 
			// wir können rekursiv weiter machen
			mission(depotBei15 + dosenAmStart - 1, strecke-15, 0);
		} 
	}

	public static void main(String[] args) {
		mission(450, 500, 0);
	}

}
das erzeugt folgende Aufgabe, würde mich auch interessieren ob wir alle das gleiche haben. Man sieht da recht schön, wie sich rekursiv das Problem vereinfacht
Code:
Aufgabe: schaffe es mit 450 Dosen  500km weit (Depot: 0)
Aufgabe: schaffe es mit 437 Dosen  500km weit (Depot: 11)
Aufgabe: schaffe es mit 424 Dosen  500km weit (Depot: 22)
Aufgabe: schaffe es mit 411 Dosen  500km weit (Depot: 33)
Aufgabe: schaffe es mit 398 Dosen  500km weit (Depot: 44)
Aufgabe: schaffe es mit 385 Dosen  500km weit (Depot: 55)
Aufgabe: schaffe es mit 372 Dosen  500km weit (Depot: 66)
Aufgabe: schaffe es mit 359 Dosen  500km weit (Depot: 77)
Aufgabe: schaffe es mit 346 Dosen  500km weit (Depot: 88)
Aufgabe: schaffe es mit 333 Dosen  500km weit (Depot: 99)
Aufgabe: schaffe es mit 320 Dosen  500km weit (Depot: 110)
Aufgabe: schaffe es mit 307 Dosen  500km weit (Depot: 121)
Aufgabe: schaffe es mit 294 Dosen  500km weit (Depot: 132)
Aufgabe: schaffe es mit 281 Dosen  500km weit (Depot: 143)
Aufgabe: schaffe es mit 268 Dosen  500km weit (Depot: 154)
Aufgabe: schaffe es mit 255 Dosen  500km weit (Depot: 165)
Aufgabe: schaffe es mit 242 Dosen  500km weit (Depot: 176)
Aufgabe: schaffe es mit 229 Dosen  500km weit (Depot: 187)
Aufgabe: schaffe es mit 216 Dosen  500km weit (Depot: 198)
Aufgabe: schaffe es mit 203 Dosen  500km weit (Depot: 209)
Aufgabe: schaffe es mit 190 Dosen  500km weit (Depot: 220)
Aufgabe: schaffe es mit 177 Dosen  500km weit (Depot: 231)
Aufgabe: schaffe es mit 164 Dosen  500km weit (Depot: 242)
Aufgabe: schaffe es mit 151 Dosen  500km weit (Depot: 253)
Aufgabe: schaffe es mit 138 Dosen  500km weit (Depot: 264)
Aufgabe: schaffe es mit 125 Dosen  500km weit (Depot: 275)
Aufgabe: schaffe es mit 112 Dosen  500km weit (Depot: 286)
Aufgabe: schaffe es mit 99 Dosen  500km weit (Depot: 297)
Aufgabe: schaffe es mit 86 Dosen  500km weit (Depot: 308)
Aufgabe: schaffe es mit 73 Dosen  500km weit (Depot: 319)
Aufgabe: schaffe es mit 60 Dosen  500km weit (Depot: 330)
Aufgabe: schaffe es mit 47 Dosen  500km weit (Depot: 341)
Aufgabe: schaffe es mit 34 Dosen  500km weit (Depot: 352)
Aufgabe: schaffe es mit 21 Dosen  500km weit (Depot: 363)
Aufgabe: schaffe es mit 8 Dosen  500km weit (Depot: 374)
Aufgabe: schaffe es mit 381 Dosen  485km weit (Depot: 0)
Aufgabe: schaffe es mit 368 Dosen  485km weit (Depot: 11)
Aufgabe: schaffe es mit 355 Dosen  485km weit (Depot: 22)
Aufgabe: schaffe es mit 342 Dosen  485km weit (Depot: 33)
Aufgabe: schaffe es mit 329 Dosen  485km weit (Depot: 44)
Aufgabe: schaffe es mit 316 Dosen  485km weit (Depot: 55)
Aufgabe: schaffe es mit 303 Dosen  485km weit (Depot: 66)
Aufgabe: schaffe es mit 290 Dosen  485km weit (Depot: 77)
Aufgabe: schaffe es mit 277 Dosen  485km weit (Depot: 88)
Aufgabe: schaffe es mit 264 Dosen  485km weit (Depot: 99)
Aufgabe: schaffe es mit 251 Dosen  485km weit (Depot: 110)
Aufgabe: schaffe es mit 238 Dosen  485km weit (Depot: 121)
Aufgabe: schaffe es mit 225 Dosen  485km weit (Depot: 132)
Aufgabe: schaffe es mit 212 Dosen  485km weit (Depot: 143)
Aufgabe: schaffe es mit 199 Dosen  485km weit (Depot: 154)
Aufgabe: schaffe es mit 186 Dosen  485km weit (Depot: 165)
Aufgabe: schaffe es mit 173 Dosen  485km weit (Depot: 176)
Aufgabe: schaffe es mit 160 Dosen  485km weit (Depot: 187)
Aufgabe: schaffe es mit 147 Dosen  485km weit (Depot: 198)
Aufgabe: schaffe es mit 134 Dosen  485km weit (Depot: 209)
Aufgabe: schaffe es mit 121 Dosen  485km weit (Depot: 220)
Aufgabe: schaffe es mit 108 Dosen  485km weit (Depot: 231)
Aufgabe: schaffe es mit 95 Dosen  485km weit (Depot: 242)
Aufgabe: schaffe es mit 82 Dosen  485km weit (Depot: 253)
Aufgabe: schaffe es mit 69 Dosen  485km weit (Depot: 264)
Aufgabe: schaffe es mit 56 Dosen  485km weit (Depot: 275)
Aufgabe: schaffe es mit 43 Dosen  485km weit (Depot: 286)
Aufgabe: schaffe es mit 30 Dosen  485km weit (Depot: 297)
Aufgabe: schaffe es mit 17 Dosen  485km weit (Depot: 308)
Aufgabe: schaffe es mit 4 Dosen  485km weit (Depot: 319)
Aufgabe: schaffe es mit 322 Dosen  470km weit (Depot: 0)
Aufgabe: schaffe es mit 309 Dosen  470km weit (Depot: 11)
Aufgabe: schaffe es mit 296 Dosen  470km weit (Depot: 22)
Aufgabe: schaffe es mit 283 Dosen  470km weit (Depot: 33)
Aufgabe: schaffe es mit 270 Dosen  470km weit (Depot: 44)
Aufgabe: schaffe es mit 257 Dosen  470km weit (Depot: 55)
Aufgabe: schaffe es mit 244 Dosen  470km weit (Depot: 66)
Aufgabe: schaffe es mit 231 Dosen  470km weit (Depot: 77)
Aufgabe: schaffe es mit 218 Dosen  470km weit (Depot: 88)
Aufgabe: schaffe es mit 205 Dosen  470km weit (Depot: 99)
Aufgabe: schaffe es mit 192 Dosen  470km weit (Depot: 110)
Aufgabe: schaffe es mit 179 Dosen  470km weit (Depot: 121)
Aufgabe: schaffe es mit 166 Dosen  470km weit (Depot: 132)
Aufgabe: schaffe es mit 153 Dosen  470km weit (Depot: 143)
Aufgabe: schaffe es mit 140 Dosen  470km weit (Depot: 154)
Aufgabe: schaffe es mit 127 Dosen  470km weit (Depot: 165)
Aufgabe: schaffe es mit 114 Dosen  470km weit (Depot: 176)
Aufgabe: schaffe es mit 101 Dosen  470km weit (Depot: 187)
Aufgabe: schaffe es mit 88 Dosen  470km weit (Depot: 198)
Aufgabe: schaffe es mit 75 Dosen  470km weit (Depot: 209)
Aufgabe: schaffe es mit 62 Dosen  470km weit (Depot: 220)
Aufgabe: schaffe es mit 49 Dosen  470km weit (Depot: 231)
Aufgabe: schaffe es mit 36 Dosen  470km weit (Depot: 242)
Aufgabe: schaffe es mit 23 Dosen  470km weit (Depot: 253)
Aufgabe: schaffe es mit 10 Dosen  470km weit (Depot: 264)
Aufgabe: schaffe es mit 273 Dosen  455km weit (Depot: 0)
Aufgabe: schaffe es mit 260 Dosen  455km weit (Depot: 11)
Aufgabe: schaffe es mit 247 Dosen  455km weit (Depot: 22)
Aufgabe: schaffe es mit 234 Dosen  455km weit (Depot: 33)
Aufgabe: schaffe es mit 221 Dosen  455km weit (Depot: 44)
Aufgabe: schaffe es mit 208 Dosen  455km weit (Depot: 55)
Aufgabe: schaffe es mit 195 Dosen  455km weit (Depot: 66)
Aufgabe: schaffe es mit 182 Dosen  455km weit (Depot: 77)
Aufgabe: schaffe es mit 169 Dosen  455km weit (Depot: 88)
Aufgabe: schaffe es mit 156 Dosen  455km weit (Depot: 99)
Aufgabe: schaffe es mit 143 Dosen  455km weit (Depot: 110)
Aufgabe: schaffe es mit 130 Dosen  455km weit (Depot: 121)
Aufgabe: schaffe es mit 117 Dosen  455km weit (Depot: 132)
Aufgabe: schaffe es mit 104 Dosen  455km weit (Depot: 143)
Aufgabe: schaffe es mit 91 Dosen  455km weit (Depot: 154)
Aufgabe: schaffe es mit 78 Dosen  455km weit (Depot: 165)
Aufgabe: schaffe es mit 65 Dosen  455km weit (Depot: 176)
Aufgabe: schaffe es mit 52 Dosen  455km weit (Depot: 187)
Aufgabe: schaffe es mit 39 Dosen  455km weit (Depot: 198)
Aufgabe: schaffe es mit 26 Dosen  455km weit (Depot: 209)
Aufgabe: schaffe es mit 13 Dosen  455km weit (Depot: 220)
Aufgabe: schaffe es mit 232 Dosen  440km weit (Depot: 0)
Aufgabe: schaffe es mit 219 Dosen  440km weit (Depot: 11)
Aufgabe: schaffe es mit 206 Dosen  440km weit (Depot: 22)
Aufgabe: schaffe es mit 193 Dosen  440km weit (Depot: 33)
Aufgabe: schaffe es mit 180 Dosen  440km weit (Depot: 44)
Aufgabe: schaffe es mit 167 Dosen  440km weit (Depot: 55)
Aufgabe: schaffe es mit 154 Dosen  440km weit (Depot: 66)
Aufgabe: schaffe es mit 141 Dosen  440km weit (Depot: 77)
Aufgabe: schaffe es mit 128 Dosen  440km weit (Depot: 88)
Aufgabe: schaffe es mit 115 Dosen  440km weit (Depot: 99)
Aufgabe: schaffe es mit 102 Dosen  440km weit (Depot: 110)
Aufgabe: schaffe es mit 89 Dosen  440km weit (Depot: 121)
Aufgabe: schaffe es mit 76 Dosen  440km weit (Depot: 132)
Aufgabe: schaffe es mit 63 Dosen  440km weit (Depot: 143)
Aufgabe: schaffe es mit 50 Dosen  440km weit (Depot: 154)
Aufgabe: schaffe es mit 37 Dosen  440km weit (Depot: 165)
Aufgabe: schaffe es mit 24 Dosen  440km weit (Depot: 176)
Aufgabe: schaffe es mit 11 Dosen  440km weit (Depot: 187)
Aufgabe: schaffe es mit 197 Dosen  425km weit (Depot: 0)
Aufgabe: schaffe es mit 184 Dosen  425km weit (Depot: 11)
Aufgabe: schaffe es mit 171 Dosen  425km weit (Depot: 22)
Aufgabe: schaffe es mit 158 Dosen  425km weit (Depot: 33)
Aufgabe: schaffe es mit 145 Dosen  425km weit (Depot: 44)
Aufgabe: schaffe es mit 132 Dosen  425km weit (Depot: 55)
Aufgabe: schaffe es mit 119 Dosen  425km weit (Depot: 66)
Aufgabe: schaffe es mit 106 Dosen  425km weit (Depot: 77)
Aufgabe: schaffe es mit 93 Dosen  425km weit (Depot: 88)
Aufgabe: schaffe es mit 80 Dosen  425km weit (Depot: 99)
Aufgabe: schaffe es mit 67 Dosen  425km weit (Depot: 110)
Aufgabe: schaffe es mit 54 Dosen  425km weit (Depot: 121)
Aufgabe: schaffe es mit 41 Dosen  425km weit (Depot: 132)
Aufgabe: schaffe es mit 28 Dosen  425km weit (Depot: 143)
Aufgabe: schaffe es mit 15 Dosen  425km weit (Depot: 154)
Aufgabe: schaffe es mit 2 Dosen  425km weit (Depot: 165)
Aufgabe: schaffe es mit 166 Dosen  410km weit (Depot: 0)
Aufgabe: schaffe es mit 153 Dosen  410km weit (Depot: 11)
Aufgabe: schaffe es mit 140 Dosen  410km weit (Depot: 22)
Aufgabe: schaffe es mit 127 Dosen  410km weit (Depot: 33)
Aufgabe: schaffe es mit 114 Dosen  410km weit (Depot: 44)
Aufgabe: schaffe es mit 101 Dosen  410km weit (Depot: 55)
Aufgabe: schaffe es mit 88 Dosen  410km weit (Depot: 66)
Aufgabe: schaffe es mit 75 Dosen  410km weit (Depot: 77)
Aufgabe: schaffe es mit 62 Dosen  410km weit (Depot: 88)
Aufgabe: schaffe es mit 49 Dosen  410km weit (Depot: 99)
Aufgabe: schaffe es mit 36 Dosen  410km weit (Depot: 110)
Aufgabe: schaffe es mit 23 Dosen  410km weit (Depot: 121)
Aufgabe: schaffe es mit 10 Dosen  410km weit (Depot: 132)
Aufgabe: schaffe es mit 141 Dosen  395km weit (Depot: 0)
Aufgabe: schaffe es mit 128 Dosen  395km weit (Depot: 11)
Aufgabe: schaffe es mit 115 Dosen  395km weit (Depot: 22)
Aufgabe: schaffe es mit 102 Dosen  395km weit (Depot: 33)
Aufgabe: schaffe es mit 89 Dosen  395km weit (Depot: 44)
Aufgabe: schaffe es mit 76 Dosen  395km weit (Depot: 55)
Aufgabe: schaffe es mit 63 Dosen  395km weit (Depot: 66)
Aufgabe: schaffe es mit 50 Dosen  395km weit (Depot: 77)
Aufgabe: schaffe es mit 37 Dosen  395km weit (Depot: 88)
Aufgabe: schaffe es mit 24 Dosen  395km weit (Depot: 99)
Aufgabe: schaffe es mit 11 Dosen  395km weit (Depot: 110)
Aufgabe: schaffe es mit 120 Dosen  380km weit (Depot: 0)
Aufgabe: schaffe es mit 107 Dosen  380km weit (Depot: 11)
Aufgabe: schaffe es mit 94 Dosen  380km weit (Depot: 22)
Aufgabe: schaffe es mit 81 Dosen  380km weit (Depot: 33)
Aufgabe: schaffe es mit 68 Dosen  380km weit (Depot: 44)
Aufgabe: schaffe es mit 55 Dosen  380km weit (Depot: 55)
Aufgabe: schaffe es mit 42 Dosen  380km weit (Depot: 66)
Aufgabe: schaffe es mit 29 Dosen  380km weit (Depot: 77)
Aufgabe: schaffe es mit 16 Dosen  380km weit (Depot: 88)
Aufgabe: schaffe es mit 3 Dosen  380km weit (Depot: 99)
Aufgabe: schaffe es mit 101 Dosen  365km weit (Depot: 0)
Aufgabe: schaffe es mit 88 Dosen  365km weit (Depot: 11)
Aufgabe: schaffe es mit 75 Dosen  365km weit (Depot: 22)
Aufgabe: schaffe es mit 62 Dosen  365km weit (Depot: 33)
Aufgabe: schaffe es mit 49 Dosen  365km weit (Depot: 44)
Aufgabe: schaffe es mit 36 Dosen  365km weit (Depot: 55)
Aufgabe: schaffe es mit 23 Dosen  365km weit (Depot: 66)
Aufgabe: schaffe es mit 10 Dosen  365km weit (Depot: 77)
Aufgabe: schaffe es mit 86 Dosen  350km weit (Depot: 0)
Aufgabe: schaffe es mit 73 Dosen  350km weit (Depot: 11)
Aufgabe: schaffe es mit 60 Dosen  350km weit (Depot: 22)
Aufgabe: schaffe es mit 47 Dosen  350km weit (Depot: 33)
Aufgabe: schaffe es mit 34 Dosen  350km weit (Depot: 44)
Aufgabe: schaffe es mit 21 Dosen  350km weit (Depot: 55)
Aufgabe: schaffe es mit 8 Dosen  350km weit (Depot: 66)
Aufgabe: schaffe es mit 73 Dosen  335km weit (Depot: 0)
Aufgabe: schaffe es mit 60 Dosen  335km weit (Depot: 11)
Aufgabe: schaffe es mit 47 Dosen  335km weit (Depot: 22)
Aufgabe: schaffe es mit 34 Dosen  335km weit (Depot: 33)
Aufgabe: schaffe es mit 21 Dosen  335km weit (Depot: 44)
Aufgabe: schaffe es mit 8 Dosen  335km weit (Depot: 55)
Aufgabe: schaffe es mit 62 Dosen  320km weit (Depot: 0)
Aufgabe: schaffe es mit 49 Dosen  320km weit (Depot: 11)
Aufgabe: schaffe es mit 36 Dosen  320km weit (Depot: 22)
Aufgabe: schaffe es mit 23 Dosen  320km weit (Depot: 33)
Aufgabe: schaffe es mit 10 Dosen  320km weit (Depot: 44)
Aufgabe: schaffe es mit 53 Dosen  305km weit (Depot: 0)
Aufgabe: schaffe es mit 40 Dosen  305km weit (Depot: 11)
Aufgabe: schaffe es mit 27 Dosen  305km weit (Depot: 22)
Aufgabe: schaffe es mit 14 Dosen  305km weit (Depot: 33)
Aufgabe: schaffe es mit 1 Dosen  305km weit (Depot: 44)
Aufgabe: schaffe es mit 44 Dosen  290km weit (Depot: 0)
Aufgabe: schaffe es mit 31 Dosen  290km weit (Depot: 11)
Aufgabe: schaffe es mit 18 Dosen  290km weit (Depot: 22)
Aufgabe: schaffe es mit 5 Dosen  290km weit (Depot: 33)
Aufgabe: schaffe es mit 37 Dosen  275km weit (Depot: 0)
Aufgabe: schaffe es mit 24 Dosen  275km weit (Depot: 11)
Aufgabe: schaffe es mit 11 Dosen  275km weit (Depot: 22)
Aufgabe: schaffe es mit 32 Dosen  260km weit (Depot: 0)
Aufgabe: schaffe es mit 19 Dosen  260km weit (Depot: 11)
Aufgabe: schaffe es mit 6 Dosen  260km weit (Depot: 22)
Aufgabe: schaffe es mit 27 Dosen  245km weit (Depot: 0)
Aufgabe: schaffe es mit 14 Dosen  245km weit (Depot: 11)
Aufgabe: schaffe es mit 1 Dosen  245km weit (Depot: 22)
Aufgabe: schaffe es mit 22 Dosen  230km weit (Depot: 0)
Aufgabe: schaffe es mit 9 Dosen  230km weit (Depot: 11)
Aufgabe: schaffe es mit 19 Dosen  215km weit (Depot: 0)
Aufgabe: schaffe es mit 6 Dosen  215km weit (Depot: 11)
Aufgabe: schaffe es mit 16 Dosen  200km weit (Depot: 0)
Aufgabe: schaffe es mit 3 Dosen  200km weit (Depot: 11)
Aufgabe: schaffe es mit 13 Dosen  185km weit (Depot: 0)
Aufgabe: schaffe es mit 12 Dosen  170km weit (Depot: 0)
Aufgabe: schaffe es mit 11 Dosen  155km weit (Depot: 0)
Aufgabe: schaffe es mit 10 Dosen  140km weit (Depot: 0)
Aufgabe: schaffe es mit 9 Dosen  125km weit (Depot: 0)
Aufgabe: schaffe es mit 8 Dosen  110km weit (Depot: 0)
Aufgabe: schaffe es mit 7 Dosen  95km weit (Depot: 0)
Aufgabe: schaffe es mit 6 Dosen  80km weit (Depot: 0)
Aufgabe: schaffe es mit 5 Dosen  65km weit (Depot: 0)
Aufgabe: schaffe es mit 4 Dosen  50km weit (Depot: 0)
Aufgabe: schaffe es mit 3 Dosen  35km weit (Depot: 0)
Aufgabe: schaffe es mit 2 Dosen  20km weit (Depot: 0)
Aufgabe: schaffe es mit 1 Dosen  5km weit (Depot: 0)
Aufgabe: schaffe es mit 0 Dosen  -10km weit (Depot: 0)
 

Oni

Top Contributor
bei beni,bei dir und bei mir würde die ausgabe so ausehen. nur bei nova ist etwas anderes.
 

Mag1c

Top Contributor
Hi,

@Bleiglanz
die große Frage ist immernoch: Essen wir erst eine Dose und tragen dann 12 weg oder essen wir unterwegs und kommen nur mit 11 an. Wenn ich mein Programm (von Seite 1) auf die "erst Essen dann gehen"-Variante umstelle, komme ich auf das gleiche Ergebnis wie du.

@zeroCool:
Du als OP solltest hier mal klären, welche Variante denn nun gelten soll.

Gruß
Mag1c
 

Bleiglanz

Gesperrter Benutzer
Mag1c hat gesagt.:
Hi,

@Bleiglanz
die große Frage ist immernoch: Essen wir erst eine Dose und tragen dann 12 weg oder essen wir unterwegs und kommen nur mit 11 an. Wenn ich mein Programm (von Seite 1) auf die "erst Essen dann gehen"-Variante umstelle, komme ich auf das gleiche Ergebnis wie du.
Ich finde dass die Aufgabenstellung da unscharf ist: muss man die Dose beim gehen dabei haben (also während des gehens essen) oder kann man erst essen und dann 12 tragen?

Keine Ahnung was da richtig ist, vielleicht gehts ja aus dem vollen Aufgabentext klarer hervor?

Wäre natürlich witzig, wenn die "erst essen dann gehen" nicht erlaubt wäre :)
 

Nova

Bekanntes Mitglied
Hallo,

Ich hatte zuerst ein paar Fehler drin und hab das ganze dann umgestrickt, außerdem wusste ich die Methoden für aufrunden und abrunden nicht mehr und hab mir das dann selbst gestrickt, desshalb der Kram mit dem catsen und den temp-Variablen...
Wenn man nur von 15km Intervallen ausgeht braucht man das mit dem imMagen nicht, was das Programm natürlich viel einfacher macht...
Hatte gestern nicht viel Zeit und habs daher so eingestellt wie es war, ohne da nochmal nachzuprüfen und das ganze sauberer zu schreiben.


Ich bin von folgenden Sachen ausgegangen:
-Man isst 1eine Dose und kann dann 15km laufen, wenn man z.B. 30km hin und 30km zurückgeht muss man auf dem Hinweg 1 Dose essen (1 isst man schon am start) und 2 auf dem Rückweg.
-Es wird berechnet ob es sinnvoll ist zurückzukehren, falls z.B. nur noch 2 Dosen am Startpunkt liegen, die Strecke aber 30km beträgt verbraucht er ja mehr um zurück und wieder hinzugehen als er geholt hat (2 um zum Punkt zurückzulaufen und 2 für Hinweg = 4 verbraucht)
-Es wird berechnet ob es sich lohnt was zu essen, d.h. den Magen wieder voll (=1.0) zu machen, denn mit vollem Magen kann er 15km gehen ohne was zu essen. Ich hab den Grenzwert mal vorläufig auf 0.5 gesetzt, also wenn weniger als halbvoll dann essen



mfg
Christian
 

Nova

Bekanntes Mitglied
Hallo,

Ich hab das Programm nochmal etwas umgeschrieben.
Leider hab ich jetzt keine Zeit mehr das noch auszutesten, vor allem die Berechnungen für imMagen müsste man nochmal nachprüfen.

Code:
public class Astronaut{
	
	private int dosen = 450; // Dosen am jeweiligen "Startpunkt"
	private int dosen_neu = 0; // Dosen die er schon am neuen Punkt ("Zielpunkt") abgelegt hat
	private double distance = 0; // Soviel "Gesamtweg" hat er zurückgelegt
	private final double VALUE = 15; // Soviel kann er mit vollem Magen laufen (Laut Aufgabenstellung 15km)
	private double imMagen = 0.0; // Soviel hat er im Magen (1.0 = voll, 0.0 = leer)
	
	public static void main(String[]args){
		// ausprobieren für 1km bis 100km in 1km Schritten
		for (int s = 1; s <= 100; s += 1){
		    new Astronaut(s);
		}
	}
	
	public Astronaut(int s){
		while (dosen > 0){ // solange es sich lohnt
			int count = 0;
			boolean b = true;
			while (b){ // solange es sich lohnt
				count++;
				//System.out.println(dosen);
				//System.out.println(imMagen);
				geheHin(s);
				if ((2*s/VALUE) < dosen){ // Nur zurückgehen falls es sich noch lohnt
					geheZuruck(s);
				} else {
					b = false;
				}
				//System.out.println(distance + "km");
				//System.out.println(imMagen);
				//System.out.println("------------");
			}
			//System.out.println("Count: " + count);
			//System.out.println("Dosen Neu: " + dosen_neu);
			distance += s; // Zurückgelegte Distanz zum zurückgelegten Gesamtweg addieren
			// Neuen "Startpunkt" setzen, dosen_neu ist jetzt dosen und dosen_neu wird zum nächsten "Zielpunkt":
			dosen = dosen_neu;
			dosen_neu = 0;
		}
		distance += imMagen*VALUE; // Noch soweit laufen bis der Magen leer ist
		imMagen = 0; // Magen leer
		// Gibt aus wie weit er mit dem jeweiligen Intervall gekommen ist
		System.out.println(s + ": " + distance);
	}
	
	public void geheHin(int s){
		int dabei; // Anzahl Dosen die der Astronaut dabei hat
		if (imMagen < s/VALUE){ // falls es sinnvoll ist essen
			imMagen = 1.0; // Magen wieder voll
			dosen -= 1; // 1 Dose wurde gegessen
		}
		if (dosen < 12){ // Soviele Dosen wie möglich mitnehemn (max.12 oder soviele wie noch da sind)
			dabei = dosen;
		} else {
			dabei = 12;
		}
		dosen -= dabei; // die Anzahl Dosen die der Astronaut dabei hat vom "Depot" abziehen
		
		double verbrauch = s/VALUE; // Verbrauch für Hinweg
		if (verbrauch < imMagen){ // Mageninhalt reicht für Hinweg
			imMagen -= verbrauch;
			verbrauch = 0;
		} else { // Mageninhalt reicht nicht für Hinweg
			if (((int)(verbrauch-imMagen)) == (verbrauch-imMagen)){
			    dabei -= (int)(verbrauch-imMagen); // abziehen wieviele Dosen er auf dem Weg essen muss
			    imMagen = 0;
			} else {
				dabei -= (int)(verbrauch-imMagen)+1; // abziehen wieviele Dosen er auf dem Weg essen muss
				imMagen = ((int)(verbrauch-imMagen)+1)-(verbrauch-imMagen);
			}		
		}
		//System.out.println("imMagen: " + imMagen);
		
		dosen_neu += dabei; // Dosen die er dabei hat an neuer Position ablegen
		//System.out.println("abgelegt: " + dabei);
	}
	
	public void geheZuruck(int s){
		double verbrauch = s/VALUE; // Verbrauch
		//System.out.println("Verbrauch Rückweg: " + verbrauch);
		//System.out.println("imMagen: " + imMagen);
		if (verbrauch <= imMagen){ // Mageninhalt reicht für Rückweg
			imMagen -= verbrauch;
			verbrauch = 0;
		} else { // Mageninhalt reicht nicht für Rückweg
			if (((int)verbrauch+imMagen) >= verbrauch){
				dosen_neu -= (int)verbrauch;
				imMagen = ((int)verbrauch+imMagen)-verbrauch;
			} else {
				//System.out.println("für Rückweg: " + ((int)verbrauch+1));
				dosen_neu -= (int)verbrauch+1;
				imMagen = ((int)verbrauch+1+imMagen)-verbrauch;
			}
		}
	}	
}


Also ich komme jetzt bei 15km Intervall auf 510km, bei 30km ebenfalls auf 510km, bei 45km knapp berfehlt: 495km
Es gingen auch noch 1km (=>516km), 3km (=>516km) und 5km (=>510km) Intervalle.


mfg
Christian
 
G

Guest

Gast
die version mit dem erst-essen-dann-gehen müsste stimmen...

also habe ich das richtig verstanden? bei 15 km - schritten schafft man 510 km, richtig?
es gibt jedoch keine möglichkeit weiter als 510 km zu kommen, oder?

laut dem typen von dem ich die übung habe, soll es eine möglichkeit geben, bei der sehr viele dosen übrig bleiben, nachdem die 500 km - marke geknackt wurde.
hab aber auch keine ahnung, wie das gehen soll...

muss man denn immer das gesamte depot zu dem nächsten punkt bringen? hat nicht einer von euch noch einen brillanten einfall, bei dem vielleicht sogar komplett anders vorgegangen wird?
 

Nova

Bekanntes Mitglied
Hallo,

Wie gesagt hatte ich noch keine Zeit mein Programm ausführlich zu testen, kann sein das da noch 1-2 kleine Fehler drin sind, kein Ahnung.

Das der Astronaut mit einer anderen Strategie weiterkommt ist wahrscheinlich. Aber die optimale Strategie rauszubekommen kann dauern...
Ich könnte mir z.B. vorstellen das man mit einer Variablen Distanz weiter kommt. Denn momentan gehen manchmal ein paar Dosen verloren, weil z.B. nur noch 2 am vorherigen "Wegpunkt" liegen, dieser aber 30km weit weg ist (=> es würden 4 Dosen Nahrung verbraucht um 2 zu holen) oder weil er beim letzten dosenholen nur noch z.B. 4 Dosen trägt weil nicht mehr mehr da waren usw.
Also optimieren kann man das sicher noch.
Vielleicht ist es auch besser am Anfang kürzer zu laufen und später weiter? Oder wie schon mal angesprochen sich "Versorgungspunkte" einrichten um dann längere Strecken zurücklegen zu können...



mfg
Christian
 

SebiB90

Top Contributor
wenn man noch ne variable einbaut für die distance die man zurücklegen muss, könnte es mit wenigern dosen gehen.
hier mal ne erweiterung von nova´s code, wie ich denke das es funzen könnte
Code:
public class Astronaut{ 
    
   private int dosen = 450; // Dosen am jeweiligen "Startpunkt" 
   private int dosen_neu = 0; // Dosen die er schon am neuen Punkt ("Zielpunkt") abgelegt hat 
   private double distance = 0; // Soviel "Gesamtweg" hat er zurückgelegt 
   private final int fullDistance = 500 //gesamte strecke
   private final double VALUE = 15; // Soviel kann er mit vollem Magen laufen (Laut Aufgabenstellung 15km) 
   private double imMagen = 0.0; // Soviel hat er im Magen (1.0 = voll, 0.0 = leer) 
    
   public static void main(String[]args){ 
          new Astronaut(); 
   } 

   public Astronaut(){ 
      while (dosen > 0){ // solange es sich lohnt 
         int count = 0; 
         boolean b = true; 
         while (b){ // solange es sich lohnt 
            count++; 
            //System.out.println(dosen); 
            //System.out.println(imMagen); 
            geheHin(15); 
            if ((2*15/VALUE) < dosen){ // Nur zurückgehen falls es sich noch lohnt 
               geheZuruck(15); 
            } else { 
               b = false; 
            } 
            //System.out.println(distance + "km"); 
            //System.out.println(imMagen); 
            //System.out.println("------------"); 
         } 
         //System.out.println("Count: " + count); 
         //System.out.println("Dosen Neu: " + dosen_neu); 
         distance += 15; // Zurückgelegte Distanz zum zurückgelegten Gesamtweg addieren 
         // Neuen "Startpunkt" setzen, dosen_neu ist jetzt dosen und dosen_neu wird zum nächsten "Zielpunkt": 
         dosen = dosen_neu; 
         dosen_neu = 0;
         //meiner erweiterung
         if(13*VALUE + distance > fullDistance) { //wenn man bis zum ende kommt ohne weiteren zwischenstop durch gehen
           geheHin(13*Value); //zum ziel direkt hingehen
           break;
         }
      } 
      //distance += imMagen*VALUE; // Noch soweit laufen bis der Magen leer ist 
      //imMagen = 0; // Magen leer 
      // Gibt aus wie weit er mit dem jeweiligen Intervall gekommen ist 
      System.out.println("Es sind noch " + dosen + " übrig"); 
   } 
   public void geheHin(int s){ 
      int dabei; // Anzahl Dosen die der Astronaut dabei hat 
      if (imMagen < s/VALUE){ // falls es sinnvoll ist essen 
         imMagen = 1.0; // Magen wieder voll 
         dosen -= 1; // 1 Dose wurde gegessen 
      } 
      if (dosen < 12){ // Soviele Dosen wie möglich mitnehemn (max.12 oder soviele wie noch da sind) 
         dabei = dosen; 
      } else { 
         dabei = 12; 
      } 
      dosen -= dabei; // die Anzahl Dosen die der Astronaut dabei hat vom "Depot" abziehen 
       
      double verbrauch = s/VALUE; // Verbrauch für Hinweg 
      if (verbrauch < imMagen){ // Mageninhalt reicht für Hinweg 
         imMagen -= verbrauch; 
         verbrauch = 0; 
      } else { // Mageninhalt reicht nicht für Hinweg 
         if (((int)(verbrauch-imMagen)) == (verbrauch-imMagen)){ 
             dabei -= (int)(verbrauch-imMagen); // abziehen wieviele Dosen er auf dem Weg essen muss 
             imMagen = 0; 
         } else { 
            dabei -= (int)(verbrauch-imMagen)+1; // abziehen wieviele Dosen er auf dem Weg essen muss 
            imMagen = ((int)(verbrauch-imMagen)+1)-(verbrauch-imMagen); 
         }       
      } 
      //System.out.println("imMagen: " + imMagen); 
       
      dosen_neu += dabei; // Dosen die er dabei hat an neuer Position ablegen 
      //System.out.println("abgelegt: " + dabei); 
   } 
    
   public void geheZuruck(int s){ 
      double verbrauch = s/VALUE; // Verbrauch 
      //System.out.println("Verbrauch Rückweg: " + verbrauch); 
      //System.out.println("imMagen: " + imMagen); 
      if (verbrauch <= imMagen){ // Mageninhalt reicht für Rückweg 
         imMagen -= verbrauch; 
         verbrauch = 0; 
      } else { // Mageninhalt reicht nicht für Rückweg 
         if (((int)verbrauch+imMagen) >= verbrauch){ 
            dosen_neu -= (int)verbrauch; 
            imMagen = ((int)verbrauch+imMagen)-verbrauch; 
         } else { 
            //System.out.println("für Rückweg: " + ((int)verbrauch+1)); 
            dosen_neu -= (int)verbrauch+1; 
            imMagen = ((int)verbrauch+1+imMagen)-verbrauch; 
         } 
      } 
   }    
}
habs nicht getestet, aber könnte funktionieren
 

Bleiglanz

Gesperrter Benutzer
kann die doppelposts keiner rauslöschen?

ich hatte gestern noch folgende Idee

wenn nur noch 14 Stück am Startpunkt liegen, dann isst man eine und trägt 12 ins depot und geht dann nicht mehr zurück, die volle lässt man einfach liegen

(damit schafft man 12 ins depot anstatt nur 11!)

hat aber auch nix gebracht, könnte aber sein, dass "gezieltes " Liegenlassen von Dosen was bringen könnte
 

Oni

Top Contributor
das hat nova doch auch geschrieben.

in seinem code hat er es so geregelt, das er nur dann zurück geht wenn es sich lohn. aber ich glaube sooo viel macht das auch nicht aus :)
 

zeroCool

Mitglied
mir ist mal so aufgefallen, dass wir gar nicht beachtet haben, dass der astronaut ja nur bis kilometer 320 kommen und dabei 12 dosen übrig haben muss. somit bleiben ja tatsächlich noch einige dosen übrig, wenn man ab dem punkt nicht mehr rekursiv weiter macht, sondern mit den letzten dosen einfach die letzten 180 km durchläuft...

hab ich da jetzt irgendwie nen total dummen denkfehler, oder stimmt das?
 

Nova

Bekanntes Mitglied
Hallo,

Wie gesagt sind es sogar 195 km:
Eine Dose ist er sofort (reicht für 15km) und 12 nimmt er mit (reicht für weitere 180km).

Wenn die Dosen nicht alle zum Ziel geschafft werden müssen könnte ich mir vorstellen das man schon ein paar übrig hat (aber halt nicht am Ziel).


mfg
Christian
 

SebiB90

Top Contributor
Nova hat gesagt.:
Hallo,

Wie gesagt sind es sogar 195 km:
Eine Dose ist er sofort (reicht für 15km) und 12 nimmt er mit (reicht für weitere 180km).

Wenn die Dosen nicht alle zum Ziel geschafft werden müssen könnte ich mir vorstellen das man schon ein paar übrig hat (aber halt nicht am Ziel).


mfg
Christian
so hab ich es doch im code gelöst.
 

TRunKX

Bekanntes Mitglied
Er kommt tatsächlich 10 Km weiter!


Habs gerade auch mal durchgesehen und geschrieben ist mal der Hammer!

Achja Rkursion ist hier wirklich Praktisch!
 
Status
Nicht offen für weitere Antworten.

Oben