مسئله مجموع زیرمجموعه‌ها (Subset Sum)

Subset Sum: پیدا کردن زیرمجموعه با جمع هدف — Backtracking با هرس، نسخه DP و مقایسه دو رویکرد

مسئله

آیا زیرمجموعه‌ای از اعداد با جمع دقیقاً هدف وجود دارد؟ [3, 34, 4, 12, 5, 2] و هدف ۹ ← بله: [4, 5]. مسئله کلاسیک NP-Complete!

رویکرد ۱: Backtracking با هرس

هر عنصر: بگیر/نگیر. دو هرس قدرتمند:

رویکرد ۲: برنامه‌نویسی پویا

اگر هدف کوچک است (مثلاً ≤ ۱۰۰۰۰):

dp[j] = آیا جمع j قابل ساخت است؟
dp[0] = True (مجموعه خالی)
برای هر عدد x: dp[j] |= dp[j - x]  (از j بزرگ به کوچک)

O(n × target) — شبه‌چندجمله‌ای (هدف را «اندازه ورودی» فرض می‌کنیم).

مقایسه دو رویکرد

ویژگیBacktrackingDP
پیچیدگینمایی (با هرس کمتر)O(n × target)
حافظهO(n) پشتهO(target)
هدف بزرگبهتر ✓نامعملی!
اعداد منفی✓ کار می‌کندسخت
خود زیرمجموعهطبیعی ✓بازسازی لازم

نسخه شمردن

«چند زیرمجموعه با جمع هدف؟» — همان DP اما شمارش: dp[j] += dp[j-x]. پایه مسائل شمارش ترکیبیاتی!

نکته: Subset Sum NP-Complete است یعنی احتمالاً راه‌حل چندجمله‌ای «همه‌حالته» ندارد — اما DP شبه‌چندجمله‌ای (وابسته به مقدار هدف) برای اهداف متوسط عالی جواب می‌دهد. انتخاب رویکرد = تحلیل اندازه ورودی!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل الگوریتم‌ها است.

ابزارهای مرتبط