TheAlgorithms-Ruby/dynamic_programming/knapsack.rb
2021-10-21 11:23:22 +05:30

64 lines
No EOL
1.8 KiB
Ruby

require "test/unit"
# 0-1 Knapsack problem
# The function returns the maximum value that can be put in a knapsack of a given capacity
def knapSack(weight, wt, val, n)
rows, cols = n+1,weight+1
# Create a 2D array to store results of subproblems
dp = Array.new(rows) { Array.new(cols) }
for i in (0..n + 1-1)
for w in (0..weight + 1-1)
# if the weight is 0 or value is zero, the corresponding cell in the 2D array is set to 0
if i == 0 || w == 0
dp[i][w] = 0
#If the weight of an element is less than the capacity of the bag, the maximum value of the two cases is taken(Either the element is taken into consideration
#or is ignored)
elsif wt[i-1] <= w
dp[i][w] = [ val[i-1] + dp[i-1][w-wt[i-1]],dp[i-1][w]].max()
#If the weight of the element is greater than the capacity of the bag, the cell is set to the value of the previous cell
else
dp[i][w] = dp[i-1][w]
end
end
end
return dp[n][weight]
end
class Knapsacktest < Test::Unit::TestCase
#Test1
def test_knapsack1
assert_equal 220, knapSack(50,[10,20,30],[60,100,120],3), "Should return 220"
end
#Test2
def test_knapsack2
assert_equal 500, knapSack(50,[50, 20, 30],[100, 200, 300],3), "Should return 500"
end
#Test3
def test_knapsack3
assert_equal 17, knapSack(10,[3,4,5, 2, 1],[10,2,3,4,0],5), "Should return 17"
end
#Test4
def test_knapsack4
assert_equal 0, knapSack(0,[23, 17, 12, 8, 20],[199,200,30,41,10],5), "Should return 0"
end
end