git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
		
			
				
	
	
		
			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)
 |