diff --git a/src/main/java/_11/_3/KnapsackDynamic.java b/src/main/java/_11/_3/KnapsackDynamic.java new file mode 100644 index 0000000..90529e3 --- /dev/null +++ b/src/main/java/_11/_3/KnapsackDynamic.java @@ -0,0 +1,33 @@ +package _11._3; + +import provided._11._3.Item; +import provided._11._3.Knapsack; +import provided._11._3.Selection; + +import java.util.*; + +public class KnapsackDynamic extends Knapsack { + + public KnapsackDynamic(int capacity, Collection candidates) { + super(capacity, candidates); + } + + @Override + public Selection pack() { + return this.pack(new Selection(), new HashMap<>()); + } + + private Selection pack(Selection me, Map mem) { + return mem.computeIfAbsent(me.getWeight(), weight -> { + Collection children = new ArrayList<>(); + for(Item candidate : this.candidates) { + if(candidate.getWeight() + me.getWeight() <= this.capacity) { + children.add(pack(new Selection(me, candidate), mem)); + } + } + + return children.stream().max(Comparator.comparingDouble(Selection::getValue)).orElse(me); + }); + } + +} diff --git a/src/main/java/_11/_3/KnapsackGreedy.java b/src/main/java/_11/_3/KnapsackGreedy.java new file mode 100644 index 0000000..938a0ef --- /dev/null +++ b/src/main/java/_11/_3/KnapsackGreedy.java @@ -0,0 +1,34 @@ +package _11._3; + +import provided._11._3.Item; +import provided._11._3.Knapsack; +import provided._11._3.Selection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +public class KnapsackGreedy extends Knapsack { + + // descending + protected final List orderedCandidates; + + public KnapsackGreedy(int capacity, Collection candidates) { + super(capacity, candidates); + this.orderedCandidates = new ArrayList<>(this.candidates); + this.orderedCandidates.sort(Comparator.comparing(Item::getValue).reversed()); + } + + @Override + public Selection pack() { + Selection selection = new Selection(); + for(Item candidate : this.orderedCandidates) { + while(candidate.getWeight() + selection.getWeight() <= this.capacity) { + selection = new Selection(selection, candidate); + } + } + return selection; + } + +} diff --git a/src/main/java/_11/_3/KnapsackRecursive.java b/src/main/java/_11/_3/KnapsackRecursive.java new file mode 100644 index 0000000..fdf2c59 --- /dev/null +++ b/src/main/java/_11/_3/KnapsackRecursive.java @@ -0,0 +1,33 @@ +package _11._3; + +import provided._11._3.Item; +import provided._11._3.Knapsack; +import provided._11._3.Selection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; + +public class KnapsackRecursive extends Knapsack { + + public KnapsackRecursive(int capacity, Collection candidates) { + super(capacity, candidates); + } + + @Override + public Selection pack() { + return this.pack(new Selection()); + } + + private Selection pack(Selection me) { + Collection children = new ArrayList<>(); + for(Item candidate : this.candidates) { + if(candidate.getWeight() + me.getWeight() <= this.capacity) { + children.add(pack(new Selection(me, candidate))); + } + } + + return children.stream().max(Comparator.comparingDouble(Selection::getValue)).orElse(me); + } + +} diff --git a/src/main/java/provided/_11/_3/Item.java b/src/main/java/provided/_11/_3/Item.java index 08c08bf..cc61823 100644 --- a/src/main/java/provided/_11/_3/Item.java +++ b/src/main/java/provided/_11/_3/Item.java @@ -1,3 +1,5 @@ +package provided._11._3; + public class Item { private String name; diff --git a/src/main/java/provided/_11/_3/Knapsack.java b/src/main/java/provided/_11/_3/Knapsack.java index 23dd2cc..08a15ae 100644 --- a/src/main/java/provided/_11/_3/Knapsack.java +++ b/src/main/java/provided/_11/_3/Knapsack.java @@ -1,3 +1,9 @@ +package provided._11._3; + +import _11._3.KnapsackDynamic; +import _11._3.KnapsackGreedy; +import _11._3.KnapsackRecursive; + import java.util.ArrayList; import java.util.Collection; import java.util.List; diff --git a/src/main/java/provided/_11/_3/KnapsackDynamic.java b/src/main/java/provided/_11/_3/KnapsackDynamic.java deleted file mode 100644 index 56084da..0000000 --- a/src/main/java/provided/_11/_3/KnapsackDynamic.java +++ /dev/null @@ -1,17 +0,0 @@ -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class KnapsackDynamic extends Knapsack { - - public KnapsackDynamic(int capacity, Collection candidates) { - super(capacity, candidates); - } - - @Override - public Selection pack() { - //TODO: implement this - return new Selection(); - } - -} diff --git a/src/main/java/provided/_11/_3/KnapsackGreedy.java b/src/main/java/provided/_11/_3/KnapsackGreedy.java deleted file mode 100644 index 76a51ae..0000000 --- a/src/main/java/provided/_11/_3/KnapsackGreedy.java +++ /dev/null @@ -1,15 +0,0 @@ -import java.util.Collection; - -public class KnapsackGreedy extends Knapsack { - - public KnapsackGreedy(int capacity, Collection candidates) { - super(capacity, candidates); - } - - @Override - public Selection pack() { - //TODO: implement this - return new Selection(); - } - -} diff --git a/src/main/java/provided/_11/_3/KnapsackRecursive.java b/src/main/java/provided/_11/_3/KnapsackRecursive.java deleted file mode 100644 index 577ab0d..0000000 --- a/src/main/java/provided/_11/_3/KnapsackRecursive.java +++ /dev/null @@ -1,15 +0,0 @@ -import java.util.Collection; - -public class KnapsackRecursive extends Knapsack { - - public KnapsackRecursive(int capacity, Collection candidates) { - super(capacity, candidates); - } - - @Override - public Selection pack() { - //TODO: implement this - return new Selection(); - } - -} diff --git a/src/main/java/provided/_11/_3/Selection.java b/src/main/java/provided/_11/_3/Selection.java index 4e6f275..0074228 100644 --- a/src/main/java/provided/_11/_3/Selection.java +++ b/src/main/java/provided/_11/_3/Selection.java @@ -1,3 +1,5 @@ +package provided._11._3; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap;