From 16e764c942b08449701a7b24521570ea1188bd11 Mon Sep 17 00:00:00 2001 From: Gang Date: Mon, 14 Oct 2019 14:48:50 -0600 Subject: [PATCH 1/2] BAEL-3349 Knapsack problem implementation in Java --- .../algorithms/knapsack/Knapsack.java | 32 ++++++++++++++ .../algorithms/knapsack/KnapsackUnitTest.java | 44 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java new file mode 100644 index 0000000000..a53ab21429 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java @@ -0,0 +1,32 @@ +package com.baeldung.algorithms.knapsack; + +class Knapsack { + + public int knapsackRec(int[] w, int[] v, int n, int W) { + if (n <= 0) + return 0; + else if (w[n - 1] > W) + return knapsackRec(w, v, n - 1, W); + else + return Math.max(knapsackRec(w, v, n - 1, W), v[n - 1] + knapsackRec(w, v, n - 1, W - w[n - 1])); + } + + public int knapsackDP(int[] w, int[] v, int n, int W) { + if (n <= 0 || W <= 0) + return 0; + int[][] m = new int[n + 1][W + 1]; + for (int j = 0; j <= W; j++) { + m[0][j] = 0; + } + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= W; j++) { + if (w[i - 1] > j) + m[i][j] = m[i - 1][j]; + else + m[i][j] = Math.max(m[i - 1][j], m[i - 1][j - w[i - 1]] + v[i - 1]); + } + } + return m[n][W]; + } +} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java new file mode 100644 index 0000000000..b168e6b1eb --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.knapsack; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class KnapsackUnitTest { + + @Test + public void givenWeightsandValues_whenCalculateMax_thenOutputCorrectResult() { + final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 }; + final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 }; + final int n = 10; + final int W = 67; + final Knapsack knapsack = new Knapsack(); + + assertEquals(1270, knapsack.knapsackRec(w, v, n, W)); + assertEquals(1270, knapsack.knapsackDP(w, v, n, W)); + } + + @Test + public void givenZeroItems_whenCalculateMax_thenOutputZero() { + final int[] w = new int[] {}; + final int[] v = new int[] {}; + final int n = 0; + final int W = 67; + final Knapsack knapsack = new Knapsack(); + + assertEquals(0, knapsack.knapsackRec(w, v, n, W)); + assertEquals(0, knapsack.knapsackDP(w, v, n, W)); + } + + @Test + public void givenZeroWeightLimit_whenCalculateMax_thenOutputZero() { + final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 }; + final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 }; + final int n = 10; + final int W = 0; + final Knapsack knapsack = new Knapsack(); + + assertEquals(0, knapsack.knapsackRec(w, v, n, W)); + assertEquals(0, knapsack.knapsackDP(w, v, n, W)); + } +} From 85b5042cb7c6ca1c7c09dcfa7f782cc66648376e Mon Sep 17 00:00:00 2001 From: Gang Date: Tue, 15 Oct 2019 21:19:57 -0600 Subject: [PATCH 2/2] BAEL-3349, Add brackets and make the class public --- .../baeldung/algorithms/knapsack/Knapsack.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java index a53ab21429..61c3f05a95 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java @@ -1,19 +1,22 @@ package com.baeldung.algorithms.knapsack; -class Knapsack { +public class Knapsack { public int knapsackRec(int[] w, int[] v, int n, int W) { - if (n <= 0) + if (n <= 0) { return 0; - else if (w[n - 1] > W) + } else if (w[n - 1] > W) { return knapsackRec(w, v, n - 1, W); - else + } else { return Math.max(knapsackRec(w, v, n - 1, W), v[n - 1] + knapsackRec(w, v, n - 1, W - w[n - 1])); + } } public int knapsackDP(int[] w, int[] v, int n, int W) { - if (n <= 0 || W <= 0) + if (n <= 0 || W <= 0) { return 0; + } + int[][] m = new int[n + 1][W + 1]; for (int j = 0; j <= W; j++) { m[0][j] = 0; @@ -21,10 +24,11 @@ class Knapsack { for (int i = 1; i <= n; i++) { for (int j = 1; j <= W; j++) { - if (w[i - 1] > j) + if (w[i - 1] > j) { m[i][j] = m[i - 1][j]; - else + } else { m[i][j] = Math.max(m[i - 1][j], m[i - 1][j - w[i - 1]] + v[i - 1]); + } } } return m[n][W];