解题思路:本题目给出了买糖总人数以及1元和2元的人数,这里提到店员没有零钱,因此所有的找零用钱全部都是从顾客那里获得,这里的数据量可以观察到不算特别的大,因此我们可以首先遍历所有的符合顾客人数的情况,比如4个顾客就用2的4次方表示情况的总数,用其二进制来表示每一种情况中出现1元和2元的情况,当前位为1则为1元,为0则为2元,在所有的情况下我们再进行逐个的判断,如果当前为0的时候就给空列表添加一个-1,为1则添加一个1,得到列表后对于每一词元素为-1的情况进行处理,如果当前元素为-1且前面的元素之和加上该-1小于0,则说明无法找回,这时就说明该种情况不符合初步筛选,将flag位置0,表示淘汰该情况,初步筛选可以得到符合“可以找零”情况的所有情况,然后进行第二次筛选,去掉1元和2元人数不符合题目要求的情况,这时只剩下排列组合了,由于这时每一种已成立的情况的0和1都不可以再换位置了,这时就将对应位置上的0和1的顺序进行排列组合,用当前已经筛选出的情况数乘以两种人数的阶乘,得到的就是最终的结果。
注意事项:1>>4指的是二进制右移,即为2的4次方,在代码中换为1>>总人数,表示初步筛选前的所有可能情况
参考代码:
def jiecheng(i):
jieguo=1
for j in range(1,i+1):
jieguo*=j
return jieguo
zong,yi,er=map(int,input().split())
count=0
for i in range(1<<zong):
flag=1
a = []
b=bin(i)[2:].zfill(zong)
if list(b).count("1")==yi and list(b).count("0")==er:
for j in range(len(b)):
if int(b[j]) == 1:
a.append(1)
else:
a.append(-1)
for k in range(len(a)):
if (sum(a[:k]) + a[k]) < 0:
flag = 0
break
if flag:
count += 1
print(count*(jiecheng(yi)*jiecheng(er)))
0.0分
1 人评分
简单的a+b (C语言代码)浏览:644 |
C语言训练-角谷猜想 (C++代码)(3N+1问题)浏览:1746 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:850 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:512 |
WU-拆分位数 (C++代码)浏览:779 |
DNA (C语言描述,数据结构)浏览:851 |
【计算两点间的距离】 (C语言代码)浏览:1474 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:557 |
循环入门练习6 (C语言代码)浏览:954 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:667 |