صرف العملات والبرمجة الديناميكية
درس 8 من 11
8صرف العملات والبرمجة الديناميكية
الصورة الكبيرةالجشع يأخذ أكبر قطعة كل مرة، ويعمل مع الريال العادي لكن يفشل مع عملات غريبة. البرمجة الديناميكية تجرّب كل الاحتمالات دون تكرار الحساب، لأنها تتذكّر.
ماذا تشاهد في الرسم: بناء الجدول من الأصغر للأكبر. كل خانة تُحسب مرة واحدة من خانات قبلها.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
تخيّل أنك تعرف أقل عدد قطع لكل مبلغ من 0 إلى 9. لتكوين 10، جرّب: لو استخدمت قطعة 5 يبقى 5 وأنت تعرف جوابها، ولو استخدمت قطعة 1 يبقى 9 وتعرف جوابها. خذ الأفضل وأضف واحدًا. هكذا تبني كل مبلغ من الذي قبله.
أقل عدد قطع: dp[0] = 0، وdp[a] = 1 + min(dp[a - c]) لكل قطعة c ≤ a يمكن الوصول إليها، وإلا لا نهاية. الزمن O(المبلغ × عدد القطع) والذاكرة O(المبلغ). عدد الطرق: ways[0] = 1، والحلقة الخارجية على القطع والداخلية على المبالغ حتى لا تُحسب التباديل (1+2 و2+1) مرتين. الجشع صحيح فقط للأنظمة «القانونية» مثل الريال واليورو.
قبل أن تبدأ
🔁الحلقات والقوائم
تكتب حلقات متداخلة وتعدّل عناصر قائمة.
🧩حل المشكلات
درس تقسيم المسألة لأجزاء أصغر.
الفكرة الجوهرية
1الجشع ومتى يفشل
بقطع 1 و3 و4 ومبلغ 6: الجشع يأخذ 4 ثم 1 ثم 1 = ثلاث قطع، والأفضل 3+3 = قطعتان.
def greedy(coins, amount):
used = []
for c in sorted(coins, reverse=True):
while amount >= c:
amount -= c
used.append(c)
return used if amount == 0 else None
print(greedy([1, 3, 4], 6))
print(greedy([1, 5, 10, 25], 30))2جدول عدد الطرق
هذا الشكل الأقرب من المسألة: بكم طريقة تكوّن المبلغ؟ ways[a] يجمع الطرق التي تنتهي بكل قطعة. الحلقة الخارجية على القطع تمنع عدّ نفس المجموعة بترتيب آخر.
def count_ways(coins, amount):
ways = [1] + [0] * amount
for c in coins:
for a in range(c, amount + 1):
ways[a] += ways[a - c]
return ways[amount]
print(count_ways([1, 2, 5], 5))
print(count_ways([2], 3))
print(count_ways([1, 5, 10, 25], 100))3تمرين: أقل عدد قطع
الآن طبّق نفس الفكرة على السؤال الآخر. ابدأ بـ dp = [0] + [inf] * amount، ولكل مبلغ جرّب كل قطعة وخذ min. لو بقي dp[amount] لا نهاية فالمبلغ مستحيل. اختبر على: قطع [1, 3, 4] ومبلغ 6 (الجواب 2)، وقطع [2] ومبلغ 3 (مستحيل)، ومبلغ 0 (الجواب 0).
مثال محلول
المسألة: بكم طريقة تكوّن 4 بقطع 1 و2؟ الجدول: بعد قطعة 1: [1,1,1,1,1]. بعد قطعة 2: ways[2] = 1 + ways[0] = 2، ways[3] = 1 + ways[1] = 2، ways[4] = 1 + ways[2] = 3. الجواب: 3 طرق: 1+1+1+1، 1+1+2، 2+2.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الجشع يعطي الأفضل دائمًا. | صحيح لعملات مثل الريال فقط. مع [1,3,4] يفشل. |
| البرمجة الديناميكية تعني تكرارًا (recursion). | تعني حفظ أجوبة المسائل الأصغر. الجدول بحلقات غالبًا أبسط وأسرع. |
أين تقابله في العمل
🏧أجهزة الصرف
تقرير أي أوراق تُخرج للمبلغ.
🎒مسائل الحقيبة
نفس فكرة الجدول لاختيار أشياء تحت حد وزن.
اختبر فهمك
بقطع 1 و3 و4، كم قطعة يحتاج المبلغ 6 بأفضل حل؟
3+3. الجشع يعطي 4+1+1 فيخطئ.
ما قيمة ways[0] في جدول عدد الطرق؟
هناك طريقة واحدة لتكوين صفر: لا تأخذ شيئًا.
ما زمن الحل بالجدول؟
كل خانة مبلغ تُجرَّب مع كل قطعة مرة.
بطاقات مراجعة سريعة
تحقق من فهمك
متى يكون المبلغ مستحيلًا؟
حين يبقى dp[المبلغ] لا نهاية بعد تجربة كل القطع.
لماذا نبدأ من المبالغ الصغيرة؟
لأن كل خانة تعتمد على خانات أصغر يجب أن تكون محسوبة.
ما الفرق بين السؤالين؟
عدد الطرق يجمع (+)، وأقل القطع يأخذ الأصغر (min) ويضيف واحدًا.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.