■ 题目描述
【打麻将】
给定一个列表,里面含所有14个元素,问这14个元素,能不能组成3+3+3+3+2的组合,3格式可以表示顺子,或者3张相同的牌,2表示对子(两张相同的牌)类似麻将胡牌一样,若能组成,返回True,不能则返回False
输入描述
输入14个数字表示列表的14个元素
输出描述
True or False
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
1 2 3 2 3 4 3 4 5 5 5 6 7 8
输出
True
因为可以组成[1,2,3][2,3,4][4,5,6][6,7,8][5,5]的3+3+3+3+2的组合
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
输出:
False
不能组成3+3+3+3+2的组合
以下代码为本人原创,可以供大家参考,若有不足之处,感谢指出!!!!
import collections
import copy
nums = list(map(int, input().split()))
count = collections.Counter(nums)
tag = Falsefor num in count.keys():if count[num] >= 2:count_copy = copy.deepcopy(count)count_copy[num] -= 2dp = {(0, 0): 0}for num in sorted(count_copy):dp_copy = collections.defaultdict(int)x, y, z = count_copy[num], count_copy[num+1], count_copy[num+2]for (i,j), c in dp.items():for k in range(3):if i+k <= x and j+k <= y and k<= z:dp_copy[k+j, k] = max(dp_copy[j+k, k], c+(x-i-k)//3 + k)dp = dp_copyif max(dp.values()) == 4:tag = Truebreak
print(tag)