From 7d73a1d57c07809d13f653fb83832714934c6cdd Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Wed, 9 Oct 2024 22:32:06 +0530 Subject: [PATCH 1/7] Optimized KnapsackMemoization algorithm --- .../dynamicprogramming/KnapsackMemoization.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java index 396efb1a7893..2e7f81ab3029 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java @@ -1,5 +1,8 @@ package com.thealgorithms.dynamicprogramming; +import java.lang.reflect.Array; +import java.util.Arrays; + /** * Recursive Solution for 0-1 knapsack with memoization * This method is basically an extension to the recursive approach so that we @@ -15,10 +18,8 @@ int knapSack(int capacity, int[] weights, int[] profits, int numOfItems) { int[][] dpTable = new int[numOfItems + 1][capacity + 1]; // Loop to initially fill the table with -1 - for (int i = 0; i < numOfItems + 1; i++) { - for (int j = 0; j < capacity + 1; j++) { - dpTable[i][j] = -1; - } + for(int []table:dpTable){ + Arrays.fill(table,-1);g } return solveKnapsackRecursive(capacity, weights, profits, numOfItems, dpTable); From f8e182ab9e6082ca26557322fec6081b203708fc Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Wed, 9 Oct 2024 22:51:18 +0530 Subject: [PATCH 2/7] Optimized KnapsackMemoization algorithm --- .../thealgorithms/dynamicprogramming/KnapsackMemoization.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java index 2e7f81ab3029..c84e45b8ba13 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java @@ -19,7 +19,7 @@ int knapSack(int capacity, int[] weights, int[] profits, int numOfItems) { // Loop to initially fill the table with -1 for(int []table:dpTable){ - Arrays.fill(table,-1);g + Arrays.fill(table,-1); } return solveKnapsackRecursive(capacity, weights, profits, numOfItems, dpTable); From 348c0fff3f6eff3db64c3d842a5c85f7b3b78b03 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Wed, 9 Oct 2024 22:55:29 +0530 Subject: [PATCH 3/7] Formatted KnapsackMemoization.java and optimized algorithm --- .../thealgorithms/dynamicprogramming/KnapsackMemoization.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java index c84e45b8ba13..67c77f73b4dd 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java @@ -18,8 +18,8 @@ int knapSack(int capacity, int[] weights, int[] profits, int numOfItems) { int[][] dpTable = new int[numOfItems + 1][capacity + 1]; // Loop to initially fill the table with -1 - for(int []table:dpTable){ - Arrays.fill(table,-1); + for (int[] table : dpTable) { + Arrays.fill(table, -1); } return solveKnapsackRecursive(capacity, weights, profits, numOfItems, dpTable); From 6136b394825273315fa0fd805eeedd7f8f05c50b Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Thu, 10 Oct 2024 08:14:31 +0530 Subject: [PATCH 4/7] Fix unused import in KnapsackMemoization.java --- .../thealgorithms/dynamicprogramming/KnapsackMemoization.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java index 67c77f73b4dd..3501e302a6ef 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java @@ -1,6 +1,5 @@ package com.thealgorithms.dynamicprogramming; -import java.lang.reflect.Array; import java.util.Arrays; /** @@ -39,7 +38,6 @@ int solveKnapsackRecursive(int capacity, int[] weights, int[] profits, int numOf if (weights[numOfItems - 1] > capacity) { // Store the value of function call stack in table dpTable[numOfItems][capacity] = solveKnapsackRecursive(capacity, weights, profits, numOfItems - 1, dpTable); - return dpTable[numOfItems][capacity]; } else { // case 1. include the item, if it is less than the capacity final int includeCurrentItem = profits[numOfItems - 1] + solveKnapsackRecursive(capacity - weights[numOfItems - 1], weights, profits, numOfItems - 1, dpTable); @@ -49,7 +47,7 @@ int solveKnapsackRecursive(int capacity, int[] weights, int[] profits, int numOf // Store the value of function call stack in table and return dpTable[numOfItems][capacity] = Math.max(includeCurrentItem, excludeCurrentItem); - return dpTable[numOfItems][capacity]; } + return dpTable[numOfItems][capacity]; } } From ac413886cc70f79a167b7a29eadb1c3b01db4029 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 11 Oct 2024 15:01:02 +0530 Subject: [PATCH 5/7] Added test cases to KnapsackMemoizationTest --- .../KnapsackMemoizationTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java index d220a2bb512e..d5d2c2556db9 100644 --- a/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java +++ b/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java @@ -31,4 +31,22 @@ void test3() { int capacity = 50; assertEquals(220, knapsackMemoization.knapSack(capacity, weight, value, weight.length)); } + + @Test + void test4() { + int[] weight = {1, 2, 3}; + int[] value = {10, 20, 30}; + int capacity = 0; + + assertEquals(0, knapsackMemoization.knapSack(capacity, weight, value, weight.length)); + } + @Test + void test5() { + int[] weight = {1, 2, 3, 8}; + int[] value = {10, 20, 30, 40}; + int capacity = 50; + + + assertEquals(100, knapsackMemoization.knapSack(capacity, weight, value, weight.length)); + } } From 681c784c4e115526065fc872d92496fcac4bdb3b Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 11 Oct 2024 15:12:29 +0530 Subject: [PATCH 6/7] Fix clang-format issue in KnapsackMemoizationTest --- .../dynamicprogramming/KnapsackMemoizationTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java index d5d2c2556db9..3545eb2667ed 100644 --- a/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java +++ b/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java @@ -37,7 +37,6 @@ void test4() { int[] weight = {1, 2, 3}; int[] value = {10, 20, 30}; int capacity = 0; - assertEquals(0, knapsackMemoization.knapSack(capacity, weight, value, weight.length)); } @Test @@ -45,8 +44,6 @@ void test5() { int[] weight = {1, 2, 3, 8}; int[] value = {10, 20, 30, 40}; int capacity = 50; - - assertEquals(100, knapsackMemoization.knapSack(capacity, weight, value, weight.length)); } } From 84ce82e98e33bf6c72dd4bc785449f61b088931b Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 18 Oct 2024 21:14:17 +0530 Subject: [PATCH 7/7] Added a check for negative rod length in Rod Cutting algorithm --- .../com/thealgorithms/dynamicprogramming/RodCutting.java | 4 ++++ .../thealgorithms/dynamicprogramming/RodCuttingTest.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/RodCutting.java b/src/main/java/com/thealgorithms/dynamicprogramming/RodCutting.java index 76b341e2c823..4bee52d2b02e 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/RodCutting.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/RodCutting.java @@ -22,6 +22,10 @@ public static int cutRod(int[] price, int n) { if (price == null || price.length == 0) { throw new IllegalArgumentException("Price array cannot be null or empty."); } + // If rod length is negative + if (n < 0) { + throw new IllegalArgumentException("Rod length cannot be negative."); + } // Create an array to store the maximum obtainable values for each rod length. int[] val = new int[n + 1]; val[0] = 0; diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/RodCuttingTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/RodCuttingTest.java index 39497a768397..aa240e1048f8 100644 --- a/src/test/java/com/thealgorithms/dynamicprogramming/RodCuttingTest.java +++ b/src/test/java/com/thealgorithms/dynamicprogramming/RodCuttingTest.java @@ -93,4 +93,10 @@ void testCutRodEmptyPrices() { int length = 5; assertThrows(IllegalArgumentException.class, () -> RodCutting.cutRod(prices, length), "An empty prices array should throw an IllegalArgumentException."); } + @Test + void testCutRodNegativeLength() { + int[] prices = {1, 5, 8, 9, 10}; + int length = -1; + assertThrows(IllegalArgumentException.class, () -> RodCutting.cutRod(prices, length), "A negative rod length should throw an IllegalArgumentException."); + } }