Skip to content
TheCScience
TheCScience
  • Home
  • Human values
  • NCERT Solutions
  • HackerRank solutions
    • HackerRank Algorithms problems solutions
    • HackerRank C solutions
    • HackerRank C++ solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
TheCScience
HackerRank Knapsack Problem Solution

HackerRank Knapsack Problem Solution

Yashwant Parihar, July 18, 2023August 1, 2024

In this post, we will solve HackerRank Knapsack Problem Solution.

You are playing a matrix-based game with the following setup and rules:

  • You are given a matrix A with n rows and m columns. Each cell contains some points. When a player passes a cell their score increases by the number written in that cell and the number in the cell becomes 0. (If the cell number is positive their score increases, otherwise it decreases.)
  • The player starts from any cell in the first row and can move left, right or down.
  • The game is over when the player reaches the last row and stops moving.

Output Format

Print the maximum sum for each test case which is as near as possible, but not exceeding, to the target sum on a separate line.

Sample Input

2
3 12
1 6 9
5 9
3 4 4 4 8

Sample Output

12
9

Explanation

In the first test case, one can pick {6, 6}. In the second, we can pick {3,3,3}.

HackerRank Knapsack Problem Solution
HackerRank Knapsack Problem Solution

Knapsack C Solution

#include <stdio.h>

#define NMAX 2005
#define MAX(a, b, c) (a >= b && a >= c) ? a : ((b >= a && b >= c) ? b : c)

int dp[NMAX][NMAX];
int A[NMAX];

int main()
{
    int T, N, K, i, j;
    
    scanf("%d", &T);
    while(T--){
        scanf("%d %d", &N, &K);
        for(i = 1; i <= N; i++)
            scanf("%d", &A[i]);
            
        for(i = 0; i <= N; i++){
            for(j = 0; j <= K; j++){
                if(i == 0 || j == 0)
                    dp[i][j] = 0;
                else if(A[i] > j)
                    dp[i][j] = dp[i - 1][j];
                else
                    dp[i][j] = MAX(dp[i - 1][j - A[i]] + A[i], dp[i][j - A[i]] + A[i], dp[i - 1][j]);
            }
        }
        
        printf("%d\n", dp[N][K]);
    }

    return 0;
}

Knapsack C++ Solution

#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int dp[2005][2005];

int solve(const vector<int> &v, const int &K, int at, int cur) {
    if (cur > K) return 0;
    if (at == v.size()) return cur;
    int &ans = dp[at][cur];
    if (ans != -1) return ans;
    ans = 0;
    ans = max(solve(v, K, at, cur+v[at]), solve(v, K, at+1, cur));
    return ans;
}

void solve() {
    int N, K;
    cin >> N >> K;
    vector<int> numbers;
    for (int i = 0; i < N; ++i) {
        int cur;
        cin >> cur;
        numbers.push_back(cur);
    }
    memset(dp, -1, sizeof(dp));
    cout << solve(numbers, K, 0, 0) << endl;
}

int main() {
    int T;
    cin >> T;
    for (int i = 0; i < T; ++i) solve();
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    return 0;
}

Knapsack C Sharp Solution

using System;
using System.Collections.Generic;
using System.IO;
class Solution {
    public static void Main(string[] args) {
		string testCaseConfig = Console.ReadLine();
		int testCases = int.Parse(testCaseConfig);
		for(int testCase = 0; testCase < testCases; testCase++) {
			var problem = KSProblem.ParseFromInput();
			var result = problem.Solve();
			Console.WriteLine(result);
		}
	}
	
	private class KSProblem {
		
		public int Target { get; set; }
		public List<int> Items { get; set; }
		public Dictionary<int, int> calculated = new Dictionary<int, int>();
		
		public static KSProblem ParseFromInput(){
			KSProblem problem = new KSProblem();
			
			string config = Console.ReadLine();
			string[] configParts = config.Split(' ');
			int itemCount = int.Parse(configParts[0]);
			problem.Target = int.Parse(configParts[1]);
			problem.Items = new List<int>();
			string[] itemConfig = Console.ReadLine().Split(' ');
			for(int itemIndex = 0; itemIndex < itemCount; itemIndex++) {
				int item = int.Parse(itemConfig[itemIndex]);
				problem.Items.Add(item);
			}
			return problem;
		}
	
		public int Solve() {
			return Math.Max(this.Target - SolveFor(this.Target), 0);
		}
		
		private int SolveFor(int target) {
			if(calculated.ContainsKey(target)){
				return calculated[target];
			}
		
			var remaining = target;
			if(target < 0) {
				return int.MaxValue;
			}
			foreach(int item in this.Items){
				remaining = Math.Min(remaining, SolveFor(target - item));
			}
			calculated[target] = remaining;
			return remaining;
		}
	}
}

Knapsack Java Solution

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class Solution {

    private static Scanner sc;

    /**
     * @param args
     */
    public static void main(String[] args) {
        sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            HashSet<Integer> map = new HashSet<Integer>();
            for (int j = 0; j < n; j++) {
                map.add(sc.nextInt());
            }
            System.out.println(getMultSum(map, k));
        }
    }

    private static int getMultSum(HashSet<Integer> map, int k) {
        Iterator<Integer> it = map.iterator();
        boolean[] sum = new boolean[k + 1];
        Arrays.fill(sum, false);
        sum[0] = true;
        int a = 0;
        for (int i = 0; i <= k; i++) {

            if (sum[i] == true) {
                it = map.iterator();
                while (it.hasNext()) {
                    a = it.next();
                    if ((i + a) <= k)
                        sum[i + a] = true;
                }
            }
        }
        for(int i=k;i>=0;i--){
            if(sum[i] == true){
                return i;
            }
        }
        return 0;
    }
}


Knapsack JavaScript Solution

Array.matrix = function(numrows, numcols, initial){
   var arr = [];
   for (var i = 0; i < numrows; ++i){
      var columns = [];
      for (var j = 0; j < numcols; ++j){
         columns[j] = initial;
      }
      arr[i] = columns;
    }
    return arr;
}

function knapsack(A, k) {
    
    k = parseInt(k);
    
    var solution = Array.matrix(A.length + 1, k+1, 0);
    
    for(var i = 0; i<= A.length; i++) {
        solution[i][0] = 0
    }

    for(var j = 0; j<= k; j++) {
        solution[0][j] = 0
    }
    
    for(var i = 1; i<= A.length; i++) {
        for(j=1; j <= k; j++) {
            solution[i][j] = solution[i-1][j];
            if(A[i-1] <= j) {
                solution[i][j] = Math.max(A[i-1] + solution[i][j - A[i-1]], A[i-1] + solution[i-1][j - A[i-1]], solution[i-1][j]);
            }
            /*
            if(A[i-1] <= j) {
                solution[i][j] = Math.max(A[i-1] + solution[i][j - A[i-1]], A[i-1] + solution[i-1][j - A[i-1]], solution[i-1][j]);
            }
            else {
                solution[i][j] = solution[i-1][j];
            }
            */
        }
    }
   
    //console.log(solution);
    console.log(solution[A.length][k]);
}


function processData(input) {
    //Enter your code here
    var lines = input.split("\n");
    
    /*
    var T = lines[0];
    if(parseInt(T) > 10) {
        console.log(0);
        return;
    }
    */
    var testCase = {};
    var line = "";
    var A = [];
    var k = 0;
    for(var i = 1; i<lines.length; i = i+2) {
        line = lines[i];
        
        k = line.split(" ")[1];
        A = lines[i+1].split(" ");

        A = A.map(Number);
        A = A.filter(function(elem, pos,arr) {
            return arr.indexOf(elem) == pos;
         }); 
        
        knapsack(A, k);
    }
    
} 

process.stdin.resume();
process.stdin.setEncoding("ascii");
_input = "";
process.stdin.on("data", function (input) {
    _input += input;
});

process.stdin.on("end", function () {
   processData(_input);
});

Knapsack Python Solution

# https://www.hackerrank.com/challenges/unbounded-knapsack

def readInput():
    in_array = []
    no_of_test_cases = int(input())
    for i in range(no_of_test_cases):
        target = int(input().split()[1])  # get expected sum
        in_array.append((target, set(map(lambda x: int(x), input().split()))))
    return in_array

def solve(test_case):
    expectedSum = test_case[0]
    values = test_case[1]
    solution = [0]
    for i in range(expectedSum+1):
        if i in values:
            solution.append(i)
        else:
            for j in range(len(solution) - 1, -1, -1):
                if i - solution[j] in values:
                    solution.append(i)
                    break
    return max(solution)

def run():
    test_cases = readInput()
    for testCase in test_cases:
        print(solve(testCase))

run()
c C# C++ HackerRank Solutions java javascript python CcppCSharpHackerrank Solutionsjavajavascriptpython

Post navigation

Previous post
Next post
  • HackerRank Dynamic Array Problem Solution
  • HackerRank 2D Array – DS Problem Solution
  • Hackerrank Array – DS Problem Solution
  • Von Neumann and Harvard Machine Architecture
  • Development of Computers
©2025 TheCScience | WordPress Theme by SuperbThemes