2019-04-04 21:03:56 +03:00
|
|
|
import unittest
|
|
|
|
|
|
2019-05-30 05:52:07 -07:00
|
|
|
from knapsack import maximum_value
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
|
|
|
|
|
|
|
|
class ChangeTest(unittest.TestCase):
|
|
|
|
|
def test_no_items(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(100, []), 0)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_one_item_too_heavy(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(10, [{"weight": 100, "value": 1}]), 0)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_cannot_be_greedy_by_weight(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(10, [{"weight": 2, "value": 5},
|
|
|
|
|
{"weight": 2, "value": 5},
|
|
|
|
|
{"weight": 2, "value": 5},
|
|
|
|
|
{"weight": 2, "value": 5},
|
|
|
|
|
{"weight": 10, "value": 21}]), 21)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_cannot_be_greedy_by_value(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(10, [{"weight": 2, "value": 20},
|
|
|
|
|
{"weight": 2, "value": 20},
|
|
|
|
|
{"weight": 2, "value": 20},
|
|
|
|
|
{"weight": 2, "value": 20},
|
|
|
|
|
{"weight": 10, "value": 50}]), 80)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_example_knapsack(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(10, [{"weight": 5, "value": 10},
|
|
|
|
|
{"weight": 4, "value": 40},
|
|
|
|
|
{"weight": 6, "value": 30},
|
|
|
|
|
{"weight": 4, "value": 50}]), 90)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_eight_items(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(104, [{"weight": 25, "value": 350},
|
|
|
|
|
{"weight": 35, "value": 400},
|
|
|
|
|
{"weight": 45, "value": 450},
|
|
|
|
|
{"weight": 5, "value": 20},
|
|
|
|
|
{"weight": 25, "value": 70},
|
|
|
|
|
{"weight": 3, "value": 8},
|
|
|
|
|
{"weight": 2, "value": 5},
|
|
|
|
|
{"weight": 2, "value": 5}]), 900)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
def test_fifteen_items(self):
|
2019-05-30 05:52:07 -07:00
|
|
|
self.assertEqual(maximum_value(750,
|
|
|
|
|
[{"weight": 70, "value": 135},
|
|
|
|
|
{"weight": 73, "value": 139},
|
|
|
|
|
{"weight": 77, "value": 149},
|
|
|
|
|
{"weight": 80, "value": 150},
|
|
|
|
|
{"weight": 82, "value": 156},
|
|
|
|
|
{"weight": 87, "value": 163},
|
|
|
|
|
{"weight": 90, "value": 173},
|
|
|
|
|
{"weight": 94, "value": 184},
|
|
|
|
|
{"weight": 98, "value": 192},
|
|
|
|
|
{"weight": 106, "value": 201},
|
|
|
|
|
{"weight": 110, "value": 210},
|
|
|
|
|
{"weight": 113, "value": 214},
|
|
|
|
|
{"weight": 115, "value": 221},
|
|
|
|
|
{"weight": 118, "value": 229},
|
|
|
|
|
{"weight": 120, "value": 240}]), 1458)
|
2019-04-04 21:03:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
unittest.main()
|