首页 > 试题广场 >

放苹果

[编程题]放苹果
  • 热度指数:161923 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}我们需要将 m 个相同的苹果放入 n 个相同的盘子中,允许有的盘子空着不放。求解有多少种不同的分法。

输入描述:
\hspace{15pt}输入两个整数 m,n \left(0 \leqq m \leqq 10;\ 1 \leqq n \leqq 10\right) 代表苹果数、盘子数。


输出描述:
\hspace{15pt}输出一个整数,代表不同的分法数量。
示例1

输入

3 2

输出

2

说明

\hspace{15pt}在这个样例中,有 (0,3)(1,2) 这两种不同的分法。
示例2

输入

7 3

输出

8

说明

\hspace{15pt}注意,由于苹果和盘子都是相同的,所以 (5,1,1)(1,5,1) 是同一种分法。
x0=input()
x0=x0.split(' ')
x=int(x0[0])
y=int(x0[1])

######生成0矩阵 y 行 x+1 列 表示把x个苹果放进y个盘子里 满足题目要求的可能性 第一行和第一列表示1个盘子/0个苹果
num=[[1 for i in range(x+1)]]

for i in range(y-1):   #############已经定义了第一行了
    num=num+[[0 for j in range(x+1)]]
    num[i+1][0]=1   #####0个果子
    num[i+1][1]=1   #####1个果子

########### num[y][x] 是x个苹果放在y个盘子里 先遍历不同x
for i in range(1,y):
    ndisk = i+1
    for j in range(2,x+1):
        napple = j
#        print([i,j],ndisk,napple)

        if napple>=ndisk:
            num[i][j]=num[i-1][j]+num[i][j-i-1]
        else:
            num[i][j]=num[j-1][j]

#for i in range(y):
#    print(num[i])

print(num[y-1][x])


发表于 2025-02-14 15:30:29 回复(0)
input_list = input().split()
m = int(input_list[0])
n = int(input_list[1])

# i 是苹果的数量
# j 是盘子的数量
matrix = [[0 for j in range(11)] for i in range(11)]
for i in range(11):
    for j in range(11):
        if j == 0&nbs***bsp;i == 0:
            matrix[i][j] = 0
            continue
        if j == 1 and i >= 1:
            matrix[i][j] = 1
            continue
        if i == 1 and j >= 1:
            matrix[i][j] = 1
            continue
        if j > 1 and i > 1:
            if i == j:
                ##和j-1相比,增加了一种盘子数量等于苹果数量的情况,这种情况下只有1种摆放方式,每个盘子里面摆一个苹果。
                matrix[i][j] = matrix[i][j - 1] + 1
            if i < j:
                ##如果盘子数量多于苹果数量,多余的盘子并不能增加摆放方式。
                matrix[i][j] = matrix[i][i]
            if i > j:
                ##如果盘子数量少于苹果数量,和j-1相比,只需要考虑j个盘子全部摆满的情况。
                ##全部摆满,意味着没有盘子是空的,每个盘子至少有一个苹果,摆放方式的数量就等于i-j个苹果j个盘子的摆放方式的数量。
                matrix[i][j] = matrix[i][j - 1] + matrix[i - j][j]

# for p in range(11):
#    print(p, matrix[p])

print(matrix[m][n])

发表于 2024-12-20 16:28:11 回复(0)
from itertools import combinations
m, n = list(map(int, input().split()))
cut_piont = [c for c in range(1,m+1)]
all_method = []
for i in range(1, n+1):
    method = list(combinations(cut_piont, i))
    for j in method:
        d = list(j)[::-1]
        apples = [1] * m
        nums = list()
        a = 0
        while d:
            a = d.pop()
            d = [x - a for x in d]
            if apples:
                nums.append(apples[:a])
                apples = apples[a:]
        c = [sum(i) for i in nums]
        c.sort()
        if c not in all_method and sum(c) == m:
            all_method.append(c)
#print(all_method)
print(len(all_method))

发表于 2024-11-27 11:25:40 回复(0)

"""函数递归思想,主要表达抽象思维,计算机语言魅力在于,给定了计算路径或者规则,输入和输出就交给晶体管解决了。言归正传哈,不妨设 f(m,n) 为分法总数,接下来就是要给定计算路径了,注意这里的计算路径类似数列递推公式,给出首几项的值,求第n项递推公式,但是计算机不要求具体的计算公式,因为计算机它可以自行迭代啊!故最简单的方法,就是通过找出第n项的前几项式子,看看它们和通项式子的关系式(也就是可迭代路径),观察规律如下:

双变量,显然,m, n 都递归,先考虑初始项,m =0, n=1 (题目条件),无论是无苹果还是一个盘子,都只有一种放法,即 f(0,n) = f(m ,1) =1. (注意 f(0,1) 只是特殊条件
先看变量n(较简单),不妨设 m < n, 盘多果少,此时,可用盘子为m,由于盘子一致,所以,f(n,m) =f(m,m).
再看m变量递归, 不妨设m >=n, 即确保盘子不空着,设每个盘子至少一个苹果,则放法数为f(m-n,n)。注意,f(m,n)= f(不空盘子法子)+f(空盘子法子),f(不空盘子法子)=f(先每个盘子放一个* 剩下苹果再放)= 1 * f(m-n,n) ,简单解释下f(不空)怎么来的,事件状态A = 状态(A1 + A2),熵增量(A) = 熵增量(A1 * A2) 
最后看f(空盘子),比上面好理解,即至少存在一个空盘子,则f(空)=f(m,n-1) 。推到完毕,以下是py。
"""
def f(mn):
    if m == 0 or n == 1:
        return 1
    if m < n:
        return f(m, m)  
    else:
        return (f(m, n-1) + f(m-n, n))
while True:
    try:
        m, n = map(int,input().split())
        print(f(m,n))
    except:
        break
#最后,各位观众老爷们,动态规划做成了数字游戏推到,创造不易,请点赞支持,谢谢了!
发表于 2024-07-02 03:38:16 回复(0)
# 跟AI磨了一个小时,他终于开窍了
from itertools import combinations_with_replacement
from collections import Counter

def distinct_combinations_of_apples(total_apples, num_bowls):
    # 直接生成所有可能的组合,每个盘子中的苹果数视为独立事件
    # 使用 combinations_with_replacement 保证了某个盘子可以有0个或多个苹果
    valid_combinations = list(combinations_with_replacement(range(total_apples + 1), num_bowls))

    # 去除不符合题意的组合(总和不足 total_apples 的)
    valid_combinations = [combo for combo in valid_combinations if sum(combo) == total_apples]

    # 将组合转化为排序后的元组,再转化为计数,从而去除顺序的影响
    counted_combinations = Counter(tuple(sorted(combo)) for combo in valid_combinations)

    # 返回去重后的组合数
    return len(counted_combinations)

# 示例,7个苹果放入4个盘子
int_two = input().split()
m = int(int_two[0])
n = int(int_two[1])
print(distinct_combinations_of_apples(m, n))  # 输出对应的结果数
编辑于 2024-04-02 23:37:14 回复(0)
理解为求满足以下条件数列的数量:
①不增加
②指定长度
③指定和
# 苹果和盘都是无序的
# 不递增数列的数量
def getNonIncreaseListNum(head_cap,sum,size):
    if(sum < 0): return 0
    if(head_cap*size<sum): return 0
    if(sum == 0): return 1
    if(size == 1): return 1
    list_num = 0
    for head_fig in range(head_cap,-1,-1):
        list_num += getNonIncreaseListNum(head_fig,sum-head_fig,size-1)
    return list_num
input_str = input()
m,n = list(map(int,input_str.split()))
way_num = getNonIncreaseListNum(m,m,n)
print(way_num)



发表于 2023-07-26 16:18:00 回复(0)

a,b = map(int,input().split())
n,s  = [],set()

def dfs():
    if sum(n) == a:
        if len(n) == b:
            t = n
        elif len(n) < b:
            t = n+([0]*(b-len(n)))
        s.add(''.join(map(str,sorted(t))))
        return
    for i in range(a+1):
        if sum(n)+i <=a and len(n)<b :
            n.append(i)
            dfs()
            n.pop()
       
dfs()
print(len(s))
发表于 2023-07-01 18:33:25 回复(1)
n, m = map(int, input().split(' '))

res = []
temp = []


def iter_counts(n1, m):
    if m == 0:
        sum = 0
        for each in temp:
            sum += each
        if sum != n:
            temp.pop(len(temp)-1)
            return
        if sorted(temp) not in res:
            res.append(sorted(temp))
        temp.pop(len(temp) - 1)
        return
    for i in range(n1+1):
        temp.append(i)
        if m > 0:
            iter_counts(n1-i, m-1)
    temp.pop(len(temp) - 1)

try:
    iter_counts(n, m)
except Exception:
    pass
print(len(res))

发表于 2023-05-15 14:24:43 回复(0)
inputs=input().strip().split(' ')

mm=int(inputs[0])
nn=int(inputs[1])


# f[m][n]=f[m][n-1]+f[m-n][n] if m>=n
# f[m][n]=f[m][m] if m<n

f = [[1 for i in range(nn+1)] for j in range(mm+1)]
for m in range(2,mm+1):
    for n in range(2,nn+1):
        if m>=n:
            f[m][n]=f[m][n-1]+f[m-n][n]
        else:
            f[m][n]=f[m][m]
print(f[-1][-1])

发表于 2023-04-26 16:56:47 回复(0)
#想了挺久才想明白
apple,pz = map(int,input().split())
def solution(a,p):
    if a == 0&nbs***bsp;p == 0&nbs***bsp;a == 1&nbs***bsp;p == 1:
        return 1
    elif a < p:
        return solution(a,a)
    return solution(a,p-1) + solution(a-p,p)
print(solution(apple,pz))

发表于 2023-04-01 00:58:28 回复(0)
import sys

m,n= map(int,input().split(' '))
def f(m,n):
    if m<0 or n<0:
        return 0
    elif m ==1 or n ==1:
        return 1
    else:
        return f(m,n-1)+f(m-n,n)
print(f(m,n))
发表于 2023-03-09 18:38:10 回复(0)
m,n=map(int,input().split())
def apple(m,n):
    if m==1&nbs***bsp;n==1 :
        return 1
    elif m==0:
        return 1
    elif m<0:
        return 0
    else:
        return apple(m,n-1)+apple(m-n,n)

print(apple(m,n))

发表于 2023-03-05 05:33:39 回复(0)
def apple(m,n):
if m < 1 or n ==1:
return 1
elif m < n:
return apple(m,m)
else:
return apple(m,n-1) + apple(m-n,n)
m,n = map(int,input().split())
print(apple(m,n))

发表于 2023-02-21 18:18:12 回复(2)
用“不降原则”来避免重复,即前一个盘子的数目要不少于后一个盘子的数目。f(m-n)就相当于在每个盘子里放一个苹果后再来摆放剩余的苹果。
m,n=map(int,input().split(' '))
def f(m,n):
    if m<2&nbs***bsp;n==1:
        return(1)
    elif m<n:
        return(f(m,m))
    else:
        return(f(m,n-1)+f(m-n,n))
print(f(m,n))



发表于 2023-02-14 16:55:40 回复(0)
m, n = map(int, input().split())


def app(a, b):
    if a < b:
        return app(a, a)
    if a <= 1:
        return 1
    return sum([app(a - i, i) for i in range(1, b + 1)])


print(app(m, n))

发表于 2023-02-03 23:45:31 回复(0)