【备战蓝桥杯青少组】第三天 放苹果

OpenJudge - 666:放苹果

描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入

复制代码
1
7 3

样例输出

复制代码
8

思路

经典的递归题,类似的还有高位到低位降序的n位数。

为了避免重复,假设每次放的新盘子的苹果数,不能超过已放过的每个盘子里的苹果数

代码

简化版

python 复制代码
def place(m,n,pre=[]):
	k=m if len(pre)==0 else min(m,pre[-1]) # k 为最大可放数
	# 不可能的情况
	if (n==0):				return 0 	# 没有盘子,就没有放法
	if (n==1 and m>k):		return 0	# 苹果太多放不下
	if (m>n*k):				return 0	# 更多的放不下
	# 唯一解的情况
	if (n==1 and m==k):		return 1
	if (m==0):				return 1
	if (k==1 and m<=n):		return 1
	if (k>=1 and m==1):		return 1
	# 其他情况
	return sum([place(m-i,n-1,pre+[i]) for i in range(k+1)]) 
	# pre为之前的盘子,i为新放的盘子的苹果数
cnt=int(input()); data=[]
for i in range(cnt): data.append(list(map(int,input().split())))
for i in range(cnt): print(place(data[i][0],data[i][1]))

完整版

python 复制代码
DEBUG=False

def place(m,n,pre=[]):
	k=m if len(pre)==0 else min(m,pre[-1]) # k 为最大可放数
	# 不可能的情况
	if (n==0):				return 0 	# 没有盘子,就没有放法
	if (n==1 and m>k):		return 0	# 苹果太多放不下
	if (m>n*k):				return 0	# 更多的放不下
	# 唯一解的情况
	if (n==1 and m==k):
		ans.append(pre+[m]);
		if DEBUG: print(ans[-1]);
		return 1
	if (m==0):
		ans.append(pre+[0]*n); 
		if DEBUG: print(ans[-1]);
		return 1
	if (k==1 and m<=n):
		ans.append(pre+[1]*m+[0]*(n-m)); 
		if DEBUG: print(ans[-1]);
		return 1
	if (m==1 and k>=1):
		ans.append(pre+[1]+[0]*(n-1)); 
		if DEBUG: print(ans[-1]);
		return 1
	# 其他情况
	return sum([place(m-i,n-1,pre+[i]) for i in range(k+1)]) 
	# pre为之前的盘子,i为新放的盘子的苹果数
cnt=int(input())
data=[]
for i in range(cnt):
	data.append(list(map(int,input().split())))
for i in range(cnt):
	ans=[]
	print(data[i],"的放法共有:",place(data[i][0],data[i][1]))
	if(not DEBUG):
		if(len(ans)>10):
			print(ans[:10],"...")
		else:
			print(ans)
相关推荐
YuforiaCode3 分钟前
第十二届蓝桥杯 2021 C/C++组 直线
c语言·c++·蓝桥杯
知来者逆21 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊26 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北27 分钟前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈1 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing1 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD2 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘3 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV3 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8244 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode