মডিউল ১৯_২ঃ সাবসেট সাম Bottom up

আমরা এখন সাবসেট সাম এর Bottom up এপ্রোচটা দেখবো। ট্যাবুলার ফরম্যাট এ এই জিনিস্টা নিয়ে চিন্তা করব।

প্রথমে ধরি,

A = {1,2,3,6}

S = 7

আমাদের কাছে A একটি সেট ও সাম ৭।

তাহলে

তাহলে এখানে ইনিশিয়ালি ফার্স্ট রো ও কলাম ইনিশিয়ালাইজ করে ফেলি। এখানে প্রথম কলাম অবশ্যই true হবে কেননা যেকোনো এলিমেন্টকে চুজ না করে আমরা ০ বানাইতে পারি। আর প্রথম সারি false হবে কেননা কোনো কিছুকে চুজ না করে আমরা 0 এর বড় সংখ্যা বানাইতে পারি না।

তারপর ১,১ ঘরে true হবে কেননা প্রথম এলিমেন্টকে চুজ করে আমরা ১ বানাইতে পারি। ১,২ থেকে শুরু করে ১,৭ অব্দি false হবে কেননা প্রথম এলিমেন্ট ১ কে চুজ করে ১ এর বেশি বড় সংখ্যা বানানো সম্ভব না।

এবার ২,১ থেকে শুরু করে ২,৩ পর্যন্ত true হবে। কেননা প্রথম দুইটা ভ্যালু চুজ করে আমরা ৩ অব্দি সাম বানাইতে পারবো। তাই ৩ অব্দি সব true| এরপর ২,৪ হতে ২,৭ অব্দি সব false|

এবার ৩,১ থেকে শুরু করে ৩,৬ পর্যন্ত true হবে। কেননা প্রথম তিনটা ভ্যালু চুজ করে আমরা ৬ অব্দি সাম বানাইতে পারবো। তাই ৩ অব্দি সব true| এরপর ৩,৭ false|

এবার ৪,১ থেকে শুরু করে ৪,৭ পর্যন্ত true হবে। কেননা প্রথম ৪টা ভ্যালু চুজ করে ৭ অব্দি বানানো সম্ভব।

ইনিশিয়ালাইজ পার্টঃ

// Some code
    dp[0][0] = true;
    for (int i = 1; i <= s; i++)
    {
        dp[0][i] = false;
    }

যদি সাম এ্যারে এর কারেন্ট এলিমেন্ট সাম থেকে ছোট বা সমান হয় তাহলে সেই এলিমেন্ট সহ বা সেটা বাদে অপশনকে কন্সিডার করবো। আর নাহলে সেটা বাদে অপশনকে নিব।

// Some code
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            if (a[i - 1] <= j)
            {
                dp[i][j] = dp[i - 1][j - a[i - 1]] || dp[i - 1][j];
            }
            else
            {
                dp[i][j] = dp[i - 1][j];
            }
        }
    
// Some code
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a[n];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int s;
    cin >> s;
    bool dp[n + 1][s + 1];
    dp[0][0] = true;
    for (int i = 1; i <= s; i++)
    {
        dp[0][i] = false;
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            if (a[i - 1] <= j)
            {
                dp[i][j] = dp[i - 1][j - a[i - 1]] || dp[i - 1][j];
            }
            else
            {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            if (dp[i][j])
                cout << "T ";
            else
                cout << "F ";
        }
        cout << endl;
    }
    // if (dp[n][s])
    //     cout << "YES" << endl;
    // else
    //     cout << "NO" << endl;
    return 0;
}

Last updated