مشكلة الحقيبة غير المحدودة
في هذا القسم، نحل أولاً مشكلة أخرى شائعة من مسائل الحقيبة: الحقيبة غير المحدودة، ثم نستكشف حالة خاصة منها: مشكلة تغيير العملات.
مشكلة الحقيبة غير المحدودة
بمعطى من العناصر، حيث وزن العنصر هو وقيمته ، وحقيبة سعتها . يمكن اختيار كل عنصر عدة مرات. فما أقصى قيمة يمكن وضعها في الحقيبة ضمن حد السعة؟ ويوضح الشكل أدناه مثالاً على ذلك.

منهج البرمجة الديناميكية
تشبه مشكلة الحقيبة غير المحدودة مشكلة الحقيبة 0-1 إلى حد كبير، ولا تختلف عنها إلا في عدم وجود حد لعدد مرات اختيار العنصر.
- في مشكلة الحقيبة 0-1، توجد نسخة واحدة فقط من كل نوع من العناصر، لذا بعد وضع العنصر في الحقيبة، لا يمكننا الاختيار إلا من العناصر الأولى.
- في مشكلة الحقيبة غير المحدودة، كمية كل نوع من العناصر غير محدودة، لذا بعد وضع العنصر في الحقيبة، يمكننا الاختيار من العناصر الأولى.
وفي ظل قواعد مشكلة الحقيبة غير المحدودة، تنقسم تغيّرات الحالة إلى حالتين.
- عدم وضع العنصر : كما في مشكلة الحقيبة 0-1، ننتقل إلى .
- وضع العنصر : على خلاف مشكلة الحقيبة 0-1، ننتقل إلى .
وبذلك تصبح معادلة انتقال الحالة:
تنفيذ الشيفرة
وبمقارنة شيفرة المشكلتين، نجد تغييراً واحداً في انتقال الحالة من إلى ، مع تطابق كل ما عدا ذلك:
تحسين المساحة
بما أن الحالة الحالية تنتقل من حالات على اليسار وفوق، فبعد تحسين المساحة ينبغي اجتياز كل صف في جدول بالترتيب الأمامي.
وترتيب الاجتياز هذا معاكس تماماً لما في الحقيبة 0-1. يُرجى الرجوع إلى الشكل أدناه لفهم الفرق بين الاثنين.
وتنفيذ الشيفرة بسيط نسبياً، إذ يكفي حذف البُعد الأول من المصفوفة dp:
مشكلة تغيير العملات
تمثل مشكلة الحقيبة صنفاً واسعاً من مسائل البرمجة الديناميكية، ولها متغيّرات كثيرة، مثل مشكلة تغيير العملات.
بمعطى من أنواع العملات، حيث فئة النوع من العملات هي ، والمبلغ المستهدف . يمكن اختيار كل نوع من العملات عدة مرات. فما أقل عدد من العملات اللازمة لتكوين المبلغ المستهدف؟ وإذا تعذّر تكوين المبلغ المستهدف، فأعد . ويوضح الشكل أدناه مثالاً على ذلك.

منهج البرمجة الديناميكية
يمكن النظر إلى مشكلة تغيير العملات على أنها حالة خاصة من مشكلة الحقيبة غير المحدودة، مع الروابط والاختلافات التالية.
- يمكن تحويل المشكلتين إحداهما إلى الأخرى: يقابل "العنصر" "العملة"، ويقابل "وزن العنصر" "فئة العملة"، وتقابل "سعة الحقيبة" "المبلغ المستهدف".
- هدفا التحسين متعاكسان: تهدف مشكلة الحقيبة غير المحدودة إلى تعظيم قيمة العناصر، بينما تهدف مشكلة تغيير العملات إلى تقليل عدد العملات.
- تبحث مشكلة الحقيبة غير المحدودة عن حلول "لا تتجاوز" سعة الحقيبة، بينما تبحث مشكلة تغيير العملات عن حلول "تكوّن بالضبط" المبلغ المستهدف.
الخطوة 1: فكّر في القرارات في كل جولة، وحدد الحالة، وبذلك تحصل على جدول
تقابل الحالة المسألة الفرعية: أقل عدد من العملات بين أنواع العملات الأولى يمكنه تكوين المبلغ ، ويُرمز إليه بـ.
حجم جدول ثنائي الأبعاد هو .
الخطوة 2: حدد البنية الفرعية المثلى، ثم استنتج معادلة انتقال الحالة
تختلف هذه المشكلة عن مشكلة الحقيبة غير المحدودة في الجانبين التاليين فيما يتعلق بمعادلة انتقال الحالة.
- تبحث هذه المشكلة عن القيمة الدنيا، لذا يلزم تغيير المعامل إلى .
- هدف التحسين هو عدد العملات لا قيمة العناصر، لذا عند اختيار عملة، أضِف فقط.
الخطوة 3: حدد الشروط الحدية وترتيب انتقال الحالة
عندما يكون المبلغ المستهدف ، يكون أقل عدد من العملات اللازمة لتكوينه ، لذا تساوي جميع قيم في العمود الأول .
وعندما لا توجد عملات، يستحيل تكوين أي مبلغ ، وهو حل غير صالح. ولتمكين دالة في معادلة انتقال الحالة من تمييز الحلول غير الصالحة واستبعادها، نفكر في استخدام لتمثيلها، أي تعيين جميع قيم في الصف الأول إلى .
تنفيذ الشيفرة
لا توفّر معظم لغات البرمجة متغيّراً بـ، ولا يمكنها إلا استخدام القيمة العظمى للنوع الصحيح int بديلاً عنه. غير أن هذا قد يؤدي إلى تجاوز سعة الأعداد الصحيحة: إذ قد تتسبب عملية في معادلة انتقال الحالة في التجاوز.
ولهذا السبب، نستخدم العدد لتمثيل الحلول غير الصالحة، لأن أقصى عدد من العملات اللازمة لتكوين هو على الأكثر. وقبل الإعادة، تحقق مما إذا كانت تساوي ؛ فإن كان كذلك، فأعد ، مما يدل على تعذّر تكوين المبلغ المستهدف. والشيفرة كما يلي:
يوضح الشكل أدناه عملية البرمجة الديناميكية لتغيير العملات، وهي تشبه مشكلة الحقيبة غير المحدودة إلى حد كبير.
تحسين المساحة
يُعالَج تحسين المساحة لمشكلة تغيير العملات بالطريقة نفسها المتبعة في مشكلة الحقيبة غير المحدودة:
مشكلة تغيير العملات II
بمعطى من أنواع العملات، حيث فئة النوع من العملات هي ، والمبلغ المستهدف . ويمكن اختيار كل نوع من العملات عدة مرات. فما عدد توليفات العملات التي يمكنها تكوين المبلغ المستهدف؟ ويوضح الشكل أدناه مثالاً على ذلك.

منهج البرمجة الديناميكية
مقارنة بالمشكلة السابقة، هدف هذه المشكلة هو إيجاد عدد التوليفات، لذا تصبح المسألة الفرعية: عدد التوليفات بين أنواع العملات الأولى التي يمكنها تكوين المبلغ . ويبقى جدول مصفوفة ثنائية الأبعاد حجمها .
وعدد توليفات الحالة الحالية يساوي مجموع التوليفات الناتجة عن عدم اختيار العملة الحالية واختيارها. ومعادلة انتقال الحالة هي:
عندما يكون المبلغ المستهدف ، لا حاجة إلى اختيار أي عملات لتكوين المبلغ المستهدف، لذا ينبغي تهيئة جميع قيم في العمود الأول إلى . وعندما لا توجد عملات، يستحيل تكوين أي مبلغ ، لذا تساوي جميع قيم في الصف الأول .
تنفيذ الشيفرة
تحسين المساحة
يُعالَج تحسين المساحة بالطريقة نفسها، إذ يكفي حذف بُعد العملات: