解题思路:本题目给出了买糖总人数以及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 人评分
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C++代码)(手动优化一下计算)浏览:1365 |
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:696 |
矩阵乘法 (C++代码)浏览:1662 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:724 |
大神老白 (C语言代码)浏览:690 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
【偶数求和】 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:751 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:606 |
printf基础练习2 (C语言代码)浏览:653 |