কম্পিউটার টিউটোরিয়াল

০-১ ন্যাপস্যাক সমস্যার পাইথন প্রোগ্রাম


এই আর্টিকেলে আমরা নিচের সমস্যা সমাধানের কথা শিখব।

সমস্যা: 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

০-১ ন্যাপস্যাক সমস্যার পাইথন প্রোগ্রাম

সभी ভেরিয়েবল লোকাল স্কোপে ঘোষণা করা হয়েছে এবং তাদের রেফারেন্স উপরের চিত্রে দেখা যাচ্ছে।

উপসংহার

এই আর্টিকেলে আমরা শিখেছি কিভাবে ০-১ ন্যাপস্যাক সমস্যার পাইথন প্রোগ্রাম লিখতে হয়।

  1. অ্যাক্টিভিটি সিলেকশন প্রব্লেমের পাইথন প্রোগ্রাম

  2. পাইথনে চক্রবৃদ্ধি বunga (Compound Interest) প্রোগ্রাম

  3. পাইথন প্রোগ্রাম: সিম্পল ইন্টারেস্ট ক্যালকুলেশন

  4. পাইথন প্রোগ্রাম: সিলেকশন সোর্ট অ্যালগরিদম