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

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)
相关推荐
程序员buddha1 天前
C语言数组详解
c语言·开发语言·算法
蒙奇D索大1 天前
【算法】递归算法的深度实践:从布尔运算到二叉树剪枝的DFS之旅
笔记·学习·算法·leetcode·深度优先·剪枝
卡提西亚1 天前
C++笔记-25-函数模板
c++·笔记·算法
ghie90901 天前
MATLAB/Simulink水箱水位控制系统实现
开发语言·算法·matlab
多多*1 天前
分布式系统中的CAP理论和BASE理论
java·数据结构·算法·log4j·maven
yuan199971 天前
基于粒子群优化(PSO)算法的PID控制器参数整定
算法
小白程序员成长日记1 天前
2025.11.10 力扣每日一题
数据结构·算法·leetcode
hoiii1871 天前
基于交替方向乘子法(ADMM)的RPCA MATLAB实现
人工智能·算法·matlab
fengfuyao9851 天前
MATLAB的加权K-means(Warp-KMeans)聚类算法
算法·matlab·kmeans
循环过三天1 天前
3.1、Python-列表
python·算法