שאלת מבחן באלגוריתמים - האוניברסיטה הפתוחה 2022 - תכנות דינמי

שאלה 1 – תשלום במטבעות

במטבעה רוקדת בצלעות אר רכך לישלם, יתנוני ממלוקחים שלמים. ויקימים, חדוקים השנויות שנכרוכים מטבעות שווה מחיר היא מחיר, יתנוני מטבעה סדירה שלפט .

חדוקים שנויות לשלם סמים עבור, לממש קדום משלם סדור מטבעה בעד , או לחלופין, לשלם קדום רכך אחרוני מטבעה בעד , ושלוני דרכים שנויות לשלם סדור מטבעה מצרך ישרר כ–.

(ג'–8 נק') הוכיחו כי לכל שלם יתנוני אפשר למחשב את .
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 892022סמסטר ב
תכנות דינמינוסחת נסיגההוכחה
הגדירו את כמספר הדרכים המסודרות לשלם סכום . נסו למצוא נוסחת נסיגה עבור על ידי בחינת המטבע האחרון שבו ניתן להשתמש.
כדי להוכיח שניתן לחשב את לכל , נציג אלגוריתם המחשב אותו. ראשית, נגדיר את הבעיה באופן מדויק ונפתח נוסחת נסיגה.

יהי מספר הסדרות השונות של מטבעות מהקבוצה שסכומן הוא בדיוק . מכיוון שהשאלה מתייחסת ל"סדר" התשלום, אנו סופרים את כל הסדרות האפשריות.

כל סדרת מטבעות שסכומה (עבור ) חייבת להסתיים באחד המטבעות מהקבוצה . נבחן את כל האפשרויות למטבע האחרון בסדרה:
1. המטבע האחרון הוא 1: אם המטבע האחרון הוא 1, יתר המטבעות בסדרה חייבים להצטבר לסכום של
. מספר הדרכים לעשות זאת הוא, על פי ההגדרה, .
2. המטבע האחרון הוא 3: אם המטבע האחרון הוא 3, יתר המטבעות בסדרה חייבים להצטבר לסכום של
. מספר הדרכים לעשות זאת הוא .
3. המטבע האחרון הוא 5: אם המטבע האחרון הוא 5, יתר המטבעות בסדרה חייבים להצטבר לסכום של
. מספר הדרכים לעשות זאת הוא .

מכיוון ששלוש האפשרויות הללו זרות (סדרה אינה יכולה להסתיים בו-זמנית בערכים שונים), לפי עקרון הסכום, נוסחת הנסיגה עבור היא:כדי שהנוסחה תהיה מוגדרת היטב, עלינו להגדיר תנאי בסיס:
-
: ישנה דרך אחת בלבד להרכיב את הסכום 0 - באמצעות הסדרה הריקה (ללא מטבעות כלל).
- לכל
, נגדיר , כיוון שלא ניתן ליצור סכום שלילי ממטבעות חיוביים.

כעת, נוכל להציג אלגוריתם לחישוב בשיטת תכנות דינמי, אשר בונה את הפתרון "מלמטה למעלה" על בסיס נוסחת הנסיגה.

**אלגוריתם לחישוב :**
1. ניצור מערך DP בגודל
לאחסון ערכי הפונקציה .
2. נאתחל את תנאי הבסיס: DP[0] = 1.

3. נרוץ בלולאה עבור i מ-1 עד
:
א. נחשב את DP[i] באמצעות הערכים הקודמים שכבר חושבו:

val1 = (i >= 1) ? DP[i-1] : 0

val3 = (i >= 3) ? DP[i-3] : 0

val5 = (i >= 5) ? DP[i-5] : 0

DP[i] = val1 + val3 + val5

4. התוצאה הסופית היא הערך המאוחסן ב-DP[n].


אלגוריתם זה מבצע לולאה באורך , ובכל איטרציה מבצע מספר קבוע של פעולות חשבון וגישה למערך. לכן, סיבוכיות הזמן שלו היא וסיבוכיות המקום היא .

מכיוון שהצגנו אלגוריתם דטרמיניסטי, אשר עוצר תמיד לאחר מספר סופי של צעדים ומחשב את לכל , הוכחנו כי ניתן לחישוב.