Merge pull request #8025 from wugangca/BAEL-3349
BAEL-3349 Knapsack problem implementation in Java
This commit is contained in:
@@ -0,0 +1,36 @@
|
|||||||
|
package com.baeldung.algorithms.knapsack;
|
||||||
|
|
||||||
|
public 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user