Related Articles
Maximum items that can be filled in K Knapsacks of given Capacity
• Difficulty Level : Expert
• Last Updated : 01 Feb, 2021

Given an integer array W[] consisting of weights of items and ‘K’ knapsacks of capacity ‘C’, find maximum weight we can put in the knapsacks if breaking of an item is not allowed.

Examples:

Input : w[] = {3, 9, 8}, k = 1, c = 11
Output : 11
The required subset will be {3, 8}
where 3+8 = 11

Input : w[] = {3, 9, 8}, k = 1, c = 10
Output :

We will use Dynamic programming to solve this problem.
We will use two variables to represent the states of DP.

1. ‘i’ – The current index we are working on.
2. ‘R’ – It contains the remaining capacity of each and every knapsack.

Now, how will a single variable store the remaining capacity of every knapsack?
For that, we will initialise ‘R’ as R = C + C*(C+1) + C*(C+1)^2 + C*(C+1)^3 ..+ C*(C+1)^(k-1)
This initialises all the ‘k’ knapsacks with capacity ‘C’.

Now, we need to perform two queries:

• Reading remaining space of jth knapsack: (r/(c+1)^(j-1))%(c+1).
• Decreasing remaining space of jth knapsack by x: set r = r – x*(c+1)^(j-1).

Now, at each step, we will have k+1 choices.

1. Reject index ‘i’.
2. Put item ‘i’ in knapsack 1.
3. Put item ‘i’ in knapsack 2.
4. Put item ‘i’ in knapsack 3.

We will choose the path that maximizes the result.

Below is the implementation of above approach:

## C++

 #include using namespace std; // 2-d array to store states of DPvector > dp; // 2-d array to store if a state// has been solvedvector > v; // Vector to store power of variable 'C'.vector exp_c; // function to compute the statesint FindMax(int i, int r, int w[],            int n, int c, int k){     // Base case    if (i >= n)        return 0;     // Checking if a state has been solved    if (v[i][r])        return dp[i][r];     // Setting a state as solved    v[i][r] = 1;    dp[i][r] = FindMax(i + 1, r, w, n, c, k);     // Recurrence relation    for (int j = 0; j < k; j++) {        int x = (r / exp_c[j]) % (c + 1);        if (x - w[i] >= 0)            dp[i][r] = max(dp[i][r], w[i] +            FindMax(i + 1, r - w[i] * exp_c[j], w, n, c, k));    }     // Returning the solved state    return dp[i][r];} // Function to initialize global variables// and find the initial value of 'R'int PreCompute(int n, int c, int k){     // Resizing the variables    exp_c.resize(k);    exp_c[0] = 1;     for (int i = 1; i < k; i++){        exp_c[i] = (exp_c[i - 1] * (c + 1));    }    dp.resize(n);    for (int i = 0; i < n; i++){        dp[i].resize(exp_c[k - 1] * (c + 1), 0);    }    v.resize(n);    for (int i = 0; i < n; i++){        v[i].resize(exp_c[k - 1] * (c + 1), 0);    }     // Variable to store the initial value of R    int R = 0;    for (int i = 0; i < k; i++){        R += exp_c[i] * c;    }    return R;} // Driver Codeint main(){    // Input array    int w[] = { 3, 8, 9 };     // number of knapsacks and capacity    int k = 1, c = 11;     int n = sizeof(w) / sizeof(int);     // Performing required pre-computation    int r = PreCompute(n, c, k);     // finding the required answer    cout << FindMax(0, r, w, n, c, k);     return 0;}

## Java

 /*package whatever //do not write package name here */import java.io.*;import java.util.*;class GFG{       // 2-d array to store if a state    // has been solved    static ArrayList> v =      new ArrayList>();       // 2-d array to store states of DP    static ArrayList> dp =      new ArrayList>();       // Vector to store power of variable 'C'.    static ArrayList exp_c =      new ArrayList();       // function to compute the states    static int FindMax(int i, int r, int w[],                       int n, int c, int k)    {               // Base case        if (i >= n)        {            return 0;        }               // Checking if a state has been solved        if(v.get(i).get(r))        {            return dp.get(i).get(r);        }               // Setting a state as solved        v.get(i).set(r, true);        dp.get(i).set(r,FindMax(i + 1, r,                                w, n, c, k));               // Recurrence relation        for (int j = 0; j < k; j++)        {            int x = (r / exp_c.get(j)) % (c + 1);            if (x - w[i] >= 0)            {                dp.get(i).set(r,Math.max(dp.get(i).get(r),w[i] +                                         FindMax(i + 1, r - w[i] *                                                 exp_c.get(j), w, n, c, k)));                 }         }               // Returning the solved state        return dp.get(i).get(r);    }       // Function to initialize global variables    // and find the initial value of 'R'    static int PreCompute(int n, int c, int k)    {               // Resizing the variables        for(int i = 0; i < k; i++)        {            exp_c.add(0);        }        exp_c.set(0, 1);        for (int i = 1; i < k; i++)        {            exp_c.set(i,(exp_c.get(i - 1) * (c + 1)));                     }        for (int i = 0; i < n; i++)        {            dp.add(new ArrayList());        }        for (int i = 0; i < n; i++)        {            for(int j = 0; j < (exp_c.get(k-1) * (c + 1)) ; j++ )            {                dp.get(i).add(0);            }        }        for (int i = 0; i < n; i++)        {            v.add(new ArrayList(Arrays.asList(              new Boolean[(exp_c.get(k-1) * (c + 1))])));        }        for (int i = 0; i < n; i++)        {            Collections.fill(v.get(i), Boolean.FALSE);        }                 // Variable to store the initial value of R        int R = 0;        for(int i = 0; i < k; i++)        {            R += exp_c.get(i) * c;                   }        return R;    }       // Driver Code    public static void main (String[] args)    {               // Input array        int w[] = { 3, 8, 9 };                 // number of knapsacks and capacity        int k = 1, c = 11;        int n = w.length;                 // Performing required pre-computation        int r = PreCompute(n, c, k);                 // finding the required answer        System.out.println(FindMax(0, r, w, n, c, k));    }} // This code is contributed by avanitrachhadiya2155

## Python3

 # 2-d array to store states of DPx = 100dp = [[0 for i in range(x)]         for i in range(x)] # 2-d array to store if a state# has been solvedv = [[0 for i in range(x)]         for i in range(x)] # Vector to store power of variable 'C'.exp_c = [] # function to compute the statesdef FindMax(i, r, w, n, c, k):     # Base case    if (i >= n):        return 0     # Checking if a state has been solved    if (v[i][r]):        return dp[i][r]     # Setting a state as solved    v[i][r] = 1    dp[i][r] = FindMax(i + 1, r, w, n, c, k)     # Recurrence relation    for j in range(k):        x = (r // exp_c[j]) % (c + 1)        if (x - w[i] >= 0):            dp[i][r] = max(dp[i][r], w[i] +            FindMax(i + 1, r - w[i] * exp_c[j],                                   w, n, c, k))     # Returning the solved state    return dp[i][r] # Function to initialize global variables# and find the initial value of 'R'def PreCompute(n, c, k):      # Resizing the variables    exp_c.append(1)     for i in range(1, k):        exp_c[i] = (exp_c[i - 1] * (c + 1))     # Variable to store the initial value of R    R = 0    for i in range(k):        R += exp_c[i] * c     return R # Driver Code # Input arrayw =[3, 8, 9] # number of knapsacks and capacityk = 1c = 11 n = len(w) # Performing required pre-computationr = PreCompute(n, c, k) # finding the required answerprint(FindMax(0, r, w, n, c, k)) # This code is contributed by Mohit Kumar

## C#

 using System;using System.Collections.Generic; class GFG{ // 2-d array to store if a state// has been solvedstatic List> v = new List>(); // 2-d array to store states of DPstatic List> dp = new List>(); // Vector to store power of variable 'C'.static List exp_c = new List(); // Function to compute the statesstatic int FindMax(int i, int r, int[] w,                   int n, int c, int k){         // Base case    if (i >= n)    {        return 0;    }         // Checking if a state has been solved    if (v[i][r])    {        return dp[i][r];    }         // Setting a state as solved    v[i][r] = true;    dp[i][r] = FindMax(i + 1, r, w, n, c, k);         // Recurrence relation    for(int j = 0; j < k; j++)    {        int x = (r / exp_c[j]) % (c + 1);                 if (x - w[i] >= 0)        {            dp[i][r] = Math.Max(dp[i][r], w[i] +                                FindMax(i + 1,                                        r - w[i] *                                        exp_c[j],                                        w, n, c, k));        }    }         // Returning the solved state    return dp[i][r];} // Function to initialize global variables// and find the initial value of 'R'static int PreCompute(int n, int c, int k){         // Resizing the variables    for(int i = 0; i < k; i++)    {        exp_c.Add(0);    }         exp_c[0] = 1;    for(int i = 1; i < k; i++)    {        exp_c[i] = (exp_c[i - 1] * (c + 1));    }         for(int i = 0; i < n; i++)    {        dp.Add(new List());    }         for(int i = 0; i < n; i++)    {        for(int j = 0;                j < (exp_c[k - 1] * (c + 1));                j++ )        {            dp[i].Add(0);        }    }         for(int i = 0; i < n; i++)    {        v.Add(new List());    }         for(int i = 0; i < n; i++)    {        for(int j = 0;                j < (exp_c[k - 1] * (c + 1));                j++ )        {            v[i].Add(false);        }    }         // Variable to store the initial value of R    int R = 0;    for(int i = 0; i < k; i++)    {        R += exp_c[i] * c;    }    return R;} // Driver codestatic public void Main(){         // Input array    int[] w = { 3, 8, 9 };         // number of knapsacks and capacity    int k = 1, c = 11;    int n = w.Length;         // Performing required pre-computation    int r = PreCompute(n, c, k);         // finding the required answer    Console.WriteLine(FindMax(0, r, w, n, c, k));}} // This code is contributed by rag2127
Output:
11

Time complexity : O(N*k*C^k).

My Personal Notes arrow_drop_up