完美项链的算法
题目:
完美项链:
小华有N种不同颜色的珠子,每种珠子有一定的数量,他想用这些珠子做项链。
其中没串项链需要M个珠子,且要求每串项链中不能有颜色相同的珠子
请问小华最多能做多少串项链。
例1:
N=4,结合一定数量珠子为{“1”:6,“2”:9,“3”:7,“4”:4},此时珠子总数量为26
M=3
那么输出有
[
(‘2’, ‘3’, ‘1’)
(‘2’, ‘3’, ‘1’)
(‘2’, ‘3’, ‘1’)
(‘2’, ‘3’, ‘4’)
(‘2’, ‘1’, ‘3’)
(‘2’, ‘4’, ‘1’)
(‘2’, ‘3’, ‘4’)
(‘2’, ‘1’, ‘3’)
]
共8条链子,最后剩余珠子为{‘1’: 0, ‘2’: 1, ‘3’: 0, ‘4’: 1}
解题思路:
目前我想到的解题思路是使用递归:
递归算法的三部曲:
- 递归函数参数定义和返回值
- 确定递归终止条件
- 递归单次的逻辑
根据上述方式,解读题目后:
递归函数的参数定义返回值:参数为组成链子的珠子数目M,全局变量(非递归内)变量count记录链子数,全局变量字典dict_temp记录当前剩余珠子的状态
确定递归终止条件:单个珠子数量大于0的种数<组成链子珠子数目M
单次递归的逻辑:从珠子数量最大的三个中选取珠子,然后项链数+1,被选中的珠子的数量-1, 继续递归
最后直接上代码:
from copy import deepcopy
def func(dict1,N,M):
"""
解题思路:
使用递归函数
递归函数的参数定义返回值:参数为组成链子的珠子数目M,全局变量(非递归内)变量count记录链子数,全局变量字典dict_temp记录当前剩余珠子的状态
确定递归终止条件:单个珠子数量大于0的种数<组成链子珠子数目M
单