@@ -96,6 +96,31 @@ describe('Knapsack', () => {
96
96
new KnapsackItem ( { value : 20 , weight : 2 } ) , // v/w ratio is 10
97
97
] ;
98
98
99
+ const maxKnapsackWeight = 15 ;
100
+
101
+ const knapsack = new Knapsack ( possibleKnapsackItems , maxKnapsackWeight ) ;
102
+
103
+ knapsack . solveUnboundedKnapsackProblem ( ) ;
104
+
105
+ expect ( knapsack . totalValue ) . toBe ( 84 + 20 + 12 + 10 + 5 ) ;
106
+ expect ( knapsack . totalWeight ) . toBe ( 15 ) ;
107
+ expect ( knapsack . selectedItems . length ) . toBe ( 5 ) ;
108
+ expect ( knapsack . selectedItems [ 0 ] . toString ( ) ) . toBe ( 'v84 w7 x 1' ) ;
109
+ expect ( knapsack . selectedItems [ 1 ] . toString ( ) ) . toBe ( 'v20 w2 x 1' ) ;
110
+ expect ( knapsack . selectedItems [ 2 ] . toString ( ) ) . toBe ( 'v10 w1 x 1' ) ;
111
+ expect ( knapsack . selectedItems [ 3 ] . toString ( ) ) . toBe ( 'v12 w3 x 1' ) ;
112
+ expect ( knapsack . selectedItems [ 4 ] . toString ( ) ) . toBe ( 'v5 w2 x 1' ) ;
113
+ } ) ;
114
+
115
+ it ( 'should solve unbound knapsack problem with items in stock' , ( ) => {
116
+ const possibleKnapsackItems = [
117
+ new KnapsackItem ( { value : 84 , weight : 7 , itemsInStock : 3 } ) , // v/w ratio is 12
118
+ new KnapsackItem ( { value : 5 , weight : 2 , itemsInStock : 2 } ) , // v/w ratio is 2.5
119
+ new KnapsackItem ( { value : 12 , weight : 3 , itemsInStock : 1 } ) , // v/w ratio is 4
120
+ new KnapsackItem ( { value : 10 , weight : 1 , itemsInStock : 6 } ) , // v/w ratio is 10
121
+ new KnapsackItem ( { value : 20 , weight : 2 , itemsInStock : 8 } ) , // v/w ratio is 10
122
+ ] ;
123
+
99
124
const maxKnapsackWeight = 17 ;
100
125
101
126
const knapsack = new Knapsack ( possibleKnapsackItems , maxKnapsackWeight ) ;
@@ -109,4 +134,29 @@ describe('Knapsack', () => {
109
134
expect ( knapsack . selectedItems [ 1 ] . toString ( ) ) . toBe ( 'v20 w2 x 1' ) ;
110
135
expect ( knapsack . selectedItems [ 2 ] . toString ( ) ) . toBe ( 'v10 w1 x 1' ) ;
111
136
} ) ;
137
+
138
+ it ( 'should solve unbound knapsack problem with items in stock and max weight more than sum of all items' , ( ) => {
139
+ const possibleKnapsackItems = [
140
+ new KnapsackItem ( { value : 84 , weight : 7 , itemsInStock : 3 } ) , // v/w ratio is 12
141
+ new KnapsackItem ( { value : 5 , weight : 2 , itemsInStock : 2 } ) , // v/w ratio is 2.5
142
+ new KnapsackItem ( { value : 12 , weight : 3 , itemsInStock : 1 } ) , // v/w ratio is 4
143
+ new KnapsackItem ( { value : 10 , weight : 1 , itemsInStock : 6 } ) , // v/w ratio is 10
144
+ new KnapsackItem ( { value : 20 , weight : 2 , itemsInStock : 8 } ) , // v/w ratio is 10
145
+ ] ;
146
+
147
+ const maxKnapsackWeight = 60 ;
148
+
149
+ const knapsack = new Knapsack ( possibleKnapsackItems , maxKnapsackWeight ) ;
150
+
151
+ knapsack . solveUnboundedKnapsackProblem ( ) ;
152
+
153
+ expect ( knapsack . totalValue ) . toBe ( ( 3 * 84 ) + ( 2 * 5 ) + ( 1 * 12 ) + ( 6 * 10 ) + ( 8 * 20 ) ) ;
154
+ expect ( knapsack . totalWeight ) . toBe ( ( 3 * 7 ) + ( 2 * 2 ) + ( 1 * 3 ) + ( 6 * 1 ) + ( 8 * 2 ) ) ;
155
+ expect ( knapsack . selectedItems . length ) . toBe ( 5 ) ;
156
+ expect ( knapsack . selectedItems [ 0 ] . toString ( ) ) . toBe ( 'v84 w7 x 3' ) ;
157
+ expect ( knapsack . selectedItems [ 1 ] . toString ( ) ) . toBe ( 'v20 w2 x 8' ) ;
158
+ expect ( knapsack . selectedItems [ 2 ] . toString ( ) ) . toBe ( 'v10 w1 x 6' ) ;
159
+ expect ( knapsack . selectedItems [ 3 ] . toString ( ) ) . toBe ( 'v12 w3 x 1' ) ;
160
+ expect ( knapsack . selectedItems [ 4 ] . toString ( ) ) . toBe ( 'v5 w2 x 2' ) ;
161
+ } ) ;
112
162
} ) ;
0 commit comments