ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元? <br /> 一、排列组合 假设6、7、8角各有50张(50张够了),先计算出所有的可能组合。 ``` a = 6 b = 7 c = 8 t = 50 # 票的张数 s = [] # 排列组合全部放到这里 # 生成的组合 for i in range(t+1): s1 = a*i s.append(s1) for j in range(t+1): s2 = a*i + b*j s.append(s2) for k in range(t+1): s3 = a*i + b*j + c*k s.append(s3) ``` <br /> 二、排序、去重 1. 先对组合就行排序,从小到大的顺序,排队站好,这里用到sort()函数(要是你用冒泡排序,那你就out啦!) 2. sort函数只是对list序列排序,并没有返回值 3. 排序完成后,接下来就是去掉重复的数据 ``` # 排序 s.sort() news = [] for i in s: if i not in news: news.append(i) print("组合生成的最大数 %s" %news[-1]) ``` <br /> 三、取出不能生成的数字 1. 不在上面组合里面的数字就是不能生成的数字了,于是我们可以先取出来。 2. 取出来后的数据放到r队列里。 3. 从r队列取最后一个数据,就是答案啦。 ``` # 提取不在列表中的数字 r = [] for i in range(6*t): if i in news: pass else: r.append(i) print("组合不能生成的数字%s" %r) print("不能生成的最大数字为%s"%r[-1]) ``` <br /> 四、参考代码 ``` a = 6 b = 7 c = 8 t = 50 # 票的张数 s = [] # 排列组合全部放到这里 # 生成的组合 for i in range(t+1): s1 = a*i s.append(s1) for j in range(t+1): s2 = a*i + b*j s.append(s2) for k in range(t+1): s3 = a*i + b*j + c*k s.append(s3) # 排序 s.sort() news = [] for i in s: if i not in news: news.append(i) print("组合生成的最大数 %s" %news[-1]) # 提取不在列表中的数字 r = [] for i in range(6*t): if i in news: pass else: r.append(i) print("组合不能生成的数字%s" %r) print("不能生成的最大数字为%s"%r[-1]) ```