Heimübungsblatt 06 (Abgabe 15.05. (bzw. 18.05. für Gruppen 26-31))

Transcription

Heimübungsblatt 06 (Abgabe 15.05. (bzw. 18.05. für Gruppen 26-31))
C. Sohler
J. Flake, A. Krivošija
R. Penninger, B. Rudak, V.Volz
SoSe 2015
DAP2 – Heimübung 6
Ausgabedatum: 8.5.15 — Abgabedatum: Fr. 15.5.15 (Mo. 18.5. für Gruppen 26-31) 12 Uhr
Aufgabe 6.1 (5 Punkte): (Gierige Algorithmen)
Sie spielen ein Computerspiel und haben eine Liste von Gegenständen, die Sie transportieren möchten, um diese später zu verkaufen oder gegen eine Belohnung einzutauschen. Der zu
erzielende Wert für Gegenstand gi sei vi . Jeder Gegenstand gi hat außerdem ein Gewicht wi .
Allerdings ist Ihr Inventar nicht ausreichend um alle Gegenstände gleichzeitig zu tragen und
Sie können die Reise zur nächsten Stadt nur einmal machen, weil die Strecke zu lang ist.
1. Jeder Gegenstand belegt einen Slot im Inventar mit insgesamt n Slots. Entwickeln Sie
einen gierigen Algorithmus zur Berechnung der optimalen (und zulässigen) Beladung
Pihres
Inventars I ⊆ g1 , . . . , gn , die den Gesamtwert der mitgenommenen Gegenstände i∈I vi
maximiert.
Beschreiben Sie Ihren Algorithmus mit eigenen Worten und geben Sie ihn in Pseudocode
an.
2. Bestimmt Ihr Algorithmus die optimale Lösung? Beweisen Sie Ihre Aussage.
3. Während Sie Ihr Inventar umräumen, beschweren Sie sich lautstark bei Ihren Freunden
über die geringe Größe Ihres Inventars und berichten diesen von Ihrer Lösung.
Einer Ihrer Freunde ist nicht beeindruckt und berichtet von einem Spiel, dass er aktuell
spielt. Dort gibt es auch eine Beschränkung des Maximal-Gewichts w, dass der SpielCharakter tragen kann.
Sie wollen weiterhin den Gesamtwert maximieren. Findet Ihr Algorithmus (mit einer
zusätzlichen Abbruchbedingung zur Kapazitätsbeschränkung) für das neue Problem in
allen möglichen Konfigurationen die optimale Lösung? Beweisen Sie Ihre Aussage bzw.
geben Sie ein Gegenbeispiel.
Aufgabe 6.2 (5 Punkte): (Dynamische Programmierung)
Das Pascalsche Dreieck bis zur Tiefe 6 sieht aus wie folgt:
0
1
2
3
4
5
6
1
1
1
1
1
1
1
2
3
4
5
6
1
6
10
15
1
1
3
1
4
10
20
1
5
15
1
6
1
n!
bezeichnen wir die k–te Zahl in der n–ten Zeile des Pascalschen Dreiecks.
Mit nk = k!·(n−k)!
6
6!
Beispielsweise ist 3 = 3!·(6−3)!
= 6·5·4·3·2·1
= 5 · 4 = 20 (die umkringelte Zahl). Wir wollen einen
3·2·1·3·2·1
Algorithmus basierend auf dynamischer Programmierung zur Bestimmung von nk erstellen.
1. Finden Sie eine rekursive Form für
n
k
.
Hinweis: Malen Sie Zeile 7 des Dreiecks auf.
2. Zeigen Sie mit vollständiger Induktion, dass Ihre rekursive Form gültig ist.
3. Entwickeln Sie einen
Algorithmus, der nach dem Entwurfsprinzip von dynamischer Pro
grammierung nk ausrechnet.
4. Analysieren Sie die Laufzeit Ihres Algorithmus.
2