mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
Feat(Improved): Add 0/1 Knapsack Problem: Recursive and Tabulation (Bottom-Up DP) Implementations in Java along with their corresponding Tests (#6425)
* feat: Add 0/1 Knapsack and its tabulation implementation with their corresponding tests * feat: Add 0/1 Knapsack and its tabulation implementation with their corresponding tests * feat: Add 0/1 Knapsack and its tabulation implementation with their corresponding tests * Feat:add 0/1knapsack and 0/1knapsacktabulation along with their tests * Feat:add 0/1knapsack and 0/1knapsacktabulation along with their tests * Feat:add 0/1knapsack and 0/1knapsacktabulation along with their tests --------- Co-authored-by: Oleksandr Klymenko <alexanderklmn@gmail.com>
This commit is contained in:
committed by
GitHub
parent
bbbc1dd946
commit
cfd784105b
@@ -0,0 +1,78 @@
|
||||
package com.thealgorithms.dynamicprogramming;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class KnapsackZeroOneTabulationTest {
|
||||
|
||||
@Test
|
||||
public void basicCheck() {
|
||||
int[] values = {60, 100, 120};
|
||||
int[] weights = {10, 20, 30};
|
||||
int capacity = 50;
|
||||
int itemCount = values.length;
|
||||
|
||||
int expected = 220; // Best choice: item 1 (100) and item 2 (120)
|
||||
int result = KnapsackZeroOneTabulation.compute(values, weights, capacity, itemCount);
|
||||
assertEquals(expected, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void emptyKnapsack() {
|
||||
int[] values = {};
|
||||
int[] weights = {};
|
||||
int capacity = 50;
|
||||
int itemCount = 0;
|
||||
|
||||
assertEquals(0, KnapsackZeroOneTabulation.compute(values, weights, capacity, itemCount));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void zeroCapacity() {
|
||||
int[] values = {60, 100, 120};
|
||||
int[] weights = {10, 20, 30};
|
||||
int capacity = 0;
|
||||
int itemCount = values.length;
|
||||
|
||||
assertEquals(0, KnapsackZeroOneTabulation.compute(values, weights, capacity, itemCount));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void negativeCapacity() {
|
||||
int[] values = {10, 20, 30};
|
||||
int[] weights = {1, 1, 1};
|
||||
int capacity = -10;
|
||||
int itemCount = values.length;
|
||||
|
||||
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOneTabulation.compute(values, weights, capacity, itemCount));
|
||||
assertEquals("Capacity must not be negative.", exception.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mismatchedLengths() {
|
||||
int[] values = {60, 100}; // Only 2 values
|
||||
int[] weights = {10, 20, 30}; // 3 weights
|
||||
int capacity = 50;
|
||||
int itemCount = 2; // Matches `values.length`
|
||||
|
||||
// You could either expect 0 or throw an IllegalArgumentException in your compute function
|
||||
assertThrows(IllegalArgumentException.class, () -> { KnapsackZeroOneTabulation.compute(values, weights, capacity, itemCount); });
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nullInputs() {
|
||||
int[] weights = {1, 2, 3};
|
||||
int capacity = 10;
|
||||
int itemCount = 3;
|
||||
|
||||
IllegalArgumentException exception1 = assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOneTabulation.compute(null, weights, capacity, itemCount));
|
||||
assertEquals("Values and weights arrays must not be null.", exception1.getMessage());
|
||||
|
||||
int[] values = {1, 2, 3};
|
||||
|
||||
IllegalArgumentException exception2 = assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOneTabulation.compute(values, null, capacity, itemCount));
|
||||
assertEquals("Values and weights arrays must not be null.", exception2.getMessage());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.thealgorithms.dynamicprogramming;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class KnapsackZeroOneTest {
|
||||
|
||||
@Test
|
||||
void basicCheck() {
|
||||
int[] values = {60, 100, 120};
|
||||
int[] weights = {10, 20, 30};
|
||||
int capacity = 50;
|
||||
int expected = 220;
|
||||
|
||||
int result = KnapsackZeroOne.compute(values, weights, capacity, values.length);
|
||||
assertEquals(expected, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void zeroCapacity() {
|
||||
int[] values = {10, 20, 30};
|
||||
int[] weights = {1, 1, 1};
|
||||
int capacity = 0;
|
||||
|
||||
int result = KnapsackZeroOne.compute(values, weights, capacity, values.length);
|
||||
assertEquals(0, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void zeroItems() {
|
||||
int[] values = {};
|
||||
int[] weights = {};
|
||||
int capacity = 10;
|
||||
|
||||
int result = KnapsackZeroOne.compute(values, weights, capacity, 0);
|
||||
assertEquals(0, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void weightsExceedingCapacity() {
|
||||
int[] values = {10, 20};
|
||||
int[] weights = {100, 200};
|
||||
int capacity = 50;
|
||||
|
||||
int result = KnapsackZeroOne.compute(values, weights, capacity, values.length);
|
||||
assertEquals(0, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void throwsOnNullArrays() {
|
||||
assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOne.compute(null, new int[] {1}, 10, 1));
|
||||
assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOne.compute(new int[] {1}, null, 10, 1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void throwsOnMismatchedArrayLengths() {
|
||||
assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOne.compute(new int[] {10, 20}, new int[] {5}, 15, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
void throwsOnNegativeInputs() {
|
||||
assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOne.compute(new int[] {10}, new int[] {5}, -1, 1));
|
||||
|
||||
assertThrows(IllegalArgumentException.class, () -> KnapsackZeroOne.compute(new int[] {10}, new int[] {5}, 5, -1));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user