import unittest

from knapsack import greedy_knapsack as kp



class        lowerCamelCase__				(   unittest.TestCase				):





			def   SCREAMING_SNAKE_CASE__     (       self	:	Union[str, Any]						):
										_lowerCAmelCase							=							[10, 20, 30, 40, 50, 60]
										_lowerCAmelCase							=							[2, 4, 6, 8, 10, 12]
										_lowerCAmelCase							=							1_00
										self.assertEqual(kp.calc_profit(lowercase__  ,  lowercase__  ,  lowercase__						)  ,  2_10						)





			def   SCREAMING_SNAKE_CASE__     (       self	:	Dict						):
										self.assertRaisesRegex(lowercase__  ,  'max_weight must greater than zero.'						)





			def   SCREAMING_SNAKE_CASE__     (       self	:	Union[str, Any]						):
										self.assertRaisesRegex(lowercase__  ,  'Weight can not be negative.'						)





			def   SCREAMING_SNAKE_CASE__     (       self	:	int						):
										self.assertRaisesRegex(lowercase__  ,  'Profit can not be negative.'						)





			def   SCREAMING_SNAKE_CASE__     (       self	:	Tuple						):
										self.assertRaisesRegex(lowercase__  ,  'max_weight must greater than zero.'						)





			def   SCREAMING_SNAKE_CASE__     (       self	:	int						):
										self.assertRaisesRegex(
										    lowercase__  ,  'The length of profit and weight must be same.'						)


if __name__ == "__main__":
				unittest.main()







import functools






def _lowerCamelCase  (		snake_case     , snake_case  ):

							# Validation
							if not isinstance(snake_case     , snake_case  ) or not all(isinstance(snake_case     , snake_case  ) for day in days  ):
														raise ValueError('The parameter days should be a list of integers'  )

							if len(snake_case  ) != 3 or not all(isinstance(snake_case     , snake_case  ) for cost in costs  ):
														raise ValueError('The parameter costs should be a list of three integers'  )

							if len(snake_case  ) == 0:
														return 0

							if min(snake_case  ) <= 0:
														raise ValueError('All days elements should be greater than 0'  )

							if max(snake_case  ) >= 366:
														raise ValueError('All days elements should be less than 366'  )

							_lowerCAmelCase							=							set(snake_case  )

							@functools.cache
							def dynamic_programming(snake_case  ) -> int:
														if index > 365:
																					return 0

														if index not in days_set:
																					return dynamic_programming(index + 1  )

														return min(
														    costs[0] + dynamic_programming(index + 1  )     , costs[1] + dynamic_programming(index + 7  )     , costs[2] + dynamic_programming(index + 30  )     , )

							return dynamic_programming(1  )


if __name__ == "__main__":
				import doctest

				doctest.testmod()






