এই আর্টিকেলে আমরা নিচের সমস্যা সমাধানের কথা শিখব।
সমস্যা: n আইটেমের ওয়েইট এবং ভ্যালু দেওয়া আছে, আমাদের এই আইটেমগুলো একটি ব্যাগে ক্যাপাসিটি W পর্যন্ত রাখতে হবে। আমাদের ম্যাক্সিমাম সংখ্যক আইটেম নিয়ে যেতে হবে এবং এর ভ্যালু রিটার্ন করতে হবে।
চলুন নিচের ইমপ্লিমেন্টেশনে সমাধানটি পর্যবেক্ষণ করি।
# ব্রুট-ফোর্স অ্যাপ্রোচ
উদাহরণ
# ব্যাগে স্টোর করা যাব সর্বোচ্চ ভ্যালু রিটার্ন করে
def knapSack(W, wt, val, n):
# ইলিশিয়াল কন্ডিশন
if n == 0 or W == 0:
return 0
# যদি ওয়েইট ক্যাপাসিটি থেকে বেশি হয় তবে অন্তর্ভুক্ত নয়
if (wt[n-1] > W):
return knapSack(W, wt, val, n-1)
# রিটার্ন either nth আইটেম ইনক্লুড বা না
else:
return max(val[n-1] + knapSack(W - wt[n-1], wt, val, n-1),
knapSack(W, wt, val, n-1))
# টেস্ট ফাংশন
val = [50, 100, 150, 200]
wt = [8, 16, 32, 40]
W = 64
n = len(val)
print(knapSack(W, wt, val, n))
আউটপুট
350
# ডাইনামিক অ্যাপ্রোচ
উদাহরণ
# একটি ডাইনামিক অ্যাপ্রোচ
# ব্যাগে স্টোর করা যাব সর্বোচ্চ ভ্যালু রিটার্ন করে
def knapSack(W, wt, val, n):
K = [[0 for x in range(W + 1)] for x in range(n + 1)]
# টেবিল বটম-আপ ম্যানার
for i in range(n + 1):
for w in range(W + 1):
if i == 0 or w == 0:
K[i][w] = 0
elif wt[i-1] <= w:
K[i][w] = max(val[i-1] + K[i-1][w - wt[i-1]], K[i-1][w])
else:
K[i][w] = K[i-1][w]
return K[n][W]
# মেইন
val = [50, 100, 150, 200]
wt = [8, 16, 32, 40]
W = 64
n = len(val)
print(knapSack(W, wt, val, n))
আউটপুট
350

সभी ভেরিয়েবল লোকাল স্কোপে ঘোষণা করা হয়েছে এবং তাদের রেফারেন্স উপরের চিত্রে দেখা যাচ্ছে।
উপসংহার
এই আর্টিকেলে আমরা শিখেছি কিভাবে ০-১ ন্যাপস্যাক সমস্যার পাইথন প্রোগ্রাম লিখতে হয়।