0Pricing
Competitive Programming Academy · درس

حقيبة محسّنة من حيث المساحة

اختزال البعد الثاني إلى صف واحد

حقيبة محسّنة من حيث المساحة درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

لماذا نحسّن استخدام الذاكرة

يستهلك الجدول الكامل ذاكرة مقدارها n مضروبة في cap، وقد يتضخم ذلك مع المدخلات الكبيرة. ويقلّل تحسين الذاكرة هذا الاستخدام إلى صف واحد تعيد استخدامه.

الصف الأخير وحده مهم

لاحظ أن كل خلية تقرأ الصف السابق فقط، ولا تقرأ أي صف أقدم منه. لذلك لا تحتاج فعليًا إلى تخزين الشبكة كاملة في آن واحد.

اختزلها إلى مصفوفة واحدة

احتفظ بمصفوفة dp واحدة طولها cap+1. وأثناء معالجة كل عنصر، اكتب فوق قيمها في مواضعها لتمثيل الصف الجديد.

dp = [0] * (cap + 1)

فخ إعادة الاستخدام

إذا مررت على السعة من اليسار إلى اليمين، فقد تكون dp[w - wt[i]] قد حُدّثت للعنصر نفسه. وهذا سيسمح لك بأخذ العنصر i مرتين.

كرّر على السعة تنازليًا

الحل هو تكرار السعة من الأعلى إلى الأسفل. ويضمن المرور بالعكس أن dp[w - wt[i]] ما زالت تحتوي على قيمة العنصر السابق.

for w in range(cap, wt[i] - 1, -1):
    dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

لماذا ينجح المرور العكسي

عند حساب dp[w]، يظل الفهرس الأصغر w - wt[i] من دون تحديث في هذه الجولة، ولذلك يعكس الصف السابق كما هو مطلوب.

توقّف مبكرًا عند الوزن

لا يمكن للسعات الأصغر من wt[i] استيعاب العنصر، لذا تتوقف الحلقة عند wt[i]. ويوفّر تخطيها بعض الدورات غير الضرورية.

الحلقة الكاملة

الحل الكامل هو حلقتان متداخلتان تعملان على مصفوفة واحدة. العناصر في الخارج، والسعة بالعكس في الداخل، وستظهر الإجابة تلقائيًا.

for i in range(n):
    for w in range(cap, wt[i] - 1, -1):
        dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

اقرأ الخلية النهائية

بعد معالجة جميع العناصر، تحتوي dp[cap] على القيمة القصوى. وهي القيمة نفسها التي سيعطيها الجدول ثنائي الأبعاد، لكن باستخدام ذاكرة أقل بكثير.

الوقت نفسه، وذاكرة أقل

لم تسرّع الخوارزمية؛ فما زالت تنفّذ عملًا من رتبة n مضروبة في cap. لقد قلّلت فقط الذاكرة من تربيعية إلى خطية.

متى يكون ذلك مفيدًا

تنقذك هذه الحيلة عندما تكون cap كبيرة، وعندما تتجاوز الشبكة ثنائية الأبعاد حد الذاكرة. إنها من أساسيات المسابقات التي تستحق الحفظ.

تحقق سريع

اختبر القاعدة الأساسية لحقيبة الظهر أحادية البعد.

مراجعة

اختزلت الجدول ثنائي الأبعاد إلى مصفوفة واحدة، وكرّرت على السعة بالعكس للحفاظ على صحة الحل، فاستبدلت الذاكرة التربيعية بالخطية. 🚀

الأسئلة الشائعة

هل درس «حقيبة محسّنة من حيث المساحة» مجاني؟

نعم — نص درس «حقيبة محسّنة من حيث المساحة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

ماذا ستتعلم في «حقيبة محسّنة من حيث المساحة»؟

اختزال البعد الثاني إلى صف واحد تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟

لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «حقيبة محسّنة من حيث المساحة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟

نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. حقيبة 0/1: خذ أو اترك
  2. حقيبة محسّنة من حيث المساحة
  3. برمجة ديناميكية للحقيبة غير المحدودة وتبديل العملات
  4. مجموع المجموعة والتقسيم
← العودة إلى Competitive Programming Academy