মডিউল ২১_২ঃ Unbounded Knapsack ইমপ্লিমেন্টেশন

এইখানে সম্পূর্ণ কোডটি 0-1 Knapsack এর মতই, শুধুমাত্র একটি পরিবর্তন করলে হবে।

Unbounded Knapsack Top Down Approach

int ch1 = val[n - 1] + unbounded_knapsack(n-1, s - w[n - 1], val, w);

Unbounded Knapsack এ উপরের লাইনটি n-1 করে আইটেমকে পরিবর্তন করা হয় নাহ। যতক্ষন weight অনুযায়ী নেয়া পসিবল ততক্ষন সেইটি আইটেমটি নিতে থাকে। তাই Unbounded Knapsack উপরের লাইনটি এইরকম হয়।

int ch1 = val[n - 1] + unbounded_knapsack(n, s - w[n - 1], val, w);
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int unbounded_knapsack(int n, int s, int val[], int w[])
{
    if (n == 0 || s == 0)
        return 0;
    if (dp[n][s] != -1)
        return dp[n][s];
    if (w[n - 1] <= s)
    {
        int ch1 = val[n - 1] + unbounded_knapsack(n, s - w[n - 1], val, w);
        int ch2 = unbounded_knapsack(n - 1, s, val, w);
        return dp[n][s] = max(ch1, ch2);
    }
    else
    {
        return dp[n][s] = unbounded_knapsack(n - 1, s, val, w);
    }
}
int main()
{
    int n, s;
    cin >> n >> s;
    int val[n], w[n];
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            dp[i][j] = -1;
        }
    }
    for (int i = 0; i < n; i++)
    {
        cin >> val[i];
    }
    for (int i = 0; i < n; i++)
    {
        cin >> w[i];
    }
    cout << unbounded_knapsack(n, s, val, w);
    return 0;
}

Unbounded Knapsack Bottom Up Approach

int op1 = dp[i-1][j - weight[i - 1]] + value[i - 1];

Unbounded Knapsack এ উপরের লাইনটি dp[i-1] [j - weight[i - 1]] করে আইটেমকে পরিবর্তন করা হয় নাহ।

তাই Unbounded Knapsack উপরের লাইনটি এইরকম হয়।

int op1 = dp[i][j - weight[i - 1]] + value[i - 1];
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, s;
    cin >> n >> s;
    int val[n], w[n];
    int dp[n + 1][s + 1];
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            if (i == 0 || j == 0)
                dp[i][j] = 0;
        }
    }
    for (int i = 0; i < n; i++)
    {
        cin >> val[i];
    }
    for (int i = 0; i < n; i++)
    {
        cin >> w[i];
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= s; j++)
        {
            if (w[i - 1] <= j)
            {
                int op1 = dp[i][j - weight[i - 1]] + value[i - 1];
                int op2 = dp[i - 1][j];
                dp[i][j] = max(op1, op2);
            }
            else
            {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    cout << dp[n][s] << endl;
    return 0;
}

Last updated