Manually merging: - README.md: I added the description from universe/README.md into the heading of dotfiles/README.md. - .envrc: dotfiles/.envrc was a superset of universe/.envrc - .gitignore: Adding some of the ignored patterns from universe/.gitignore to dotfiles/.gitignore Everything else here should be a simple rename.
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| from math import floor
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # Solution
 | |
| ################################################################################
 | |
| def max_duffel_bag_value(xs, cap):
 | |
|     ct = (cap + 1)
 | |
|     maxes = [0] * ct
 | |
|     for c in range(cap + 1):
 | |
|         for w, v in xs:
 | |
|             if w == 0 and v > 0:
 | |
|                 return float('inf')
 | |
|             if w == c:
 | |
|                 maxes[c:] = [max(maxes[c], v)] * (ct - c)
 | |
|             elif w < c:
 | |
|                 d = c - w
 | |
|                 maxes[c:] = [max(maxes[c], v + maxes[d])] * (ct - c)
 | |
|             else:
 | |
|                 continue
 | |
|     return maxes[cap]
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # Tests
 | |
| ################################################################################
 | |
| class Test(unittest.TestCase):
 | |
|     def test_one_cake(self):
 | |
|         actual = max_duffel_bag_value([(2, 1)], 9)
 | |
|         expected = 4
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_two_cakes(self):
 | |
|         actual = max_duffel_bag_value([(4, 4), (5, 5)], 9)
 | |
|         expected = 9
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_only_take_less_valuable_cake(self):
 | |
|         actual = max_duffel_bag_value([(4, 4), (5, 5)], 12)
 | |
|         expected = 12
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_lots_of_cakes(self):
 | |
|         actual = max_duffel_bag_value([(2, 3), (3, 6), (5, 1), (6, 1), (7, 1),
 | |
|                                        (8, 1)], 7)
 | |
|         expected = 12
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_value_to_weight_ratio_is_not_optimal(self):
 | |
|         actual = max_duffel_bag_value([(51, 52), (50, 50)], 100)
 | |
|         expected = 100
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_zero_capacity(self):
 | |
|         actual = max_duffel_bag_value([(1, 2)], 0)
 | |
|         expected = 0
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_cake_with_zero_value_and_weight(self):
 | |
|         actual = max_duffel_bag_value([(0, 0), (2, 1)], 7)
 | |
|         expected = 3
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_cake_with_non_zero_value_and_zero_weight(self):
 | |
|         actual = max_duffel_bag_value([(0, 5)], 5)
 | |
|         expected = float('inf')
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
| 
 | |
| unittest.main(verbosity=2)
 |