【Python刷面试题】:分礼物

本文探讨了将n个无差别的礼物分给k个小朋友的问题,提供了两种算法实现:一种是通过递归枚举所有可能的分配方式,另一种是采用动态规划思想解决。详细介绍了算法的原理、代码实现及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:分礼物

圣诞节到了,城堡里有k个小朋友,圣诞老人口袋里带了n件无差别的小礼物,请帮圣诞老人处理:将n个无差别的礼物分给k个小朋友的分法问题,给定n和k,数出分法种数,并枚举所有的分法。

输入描述

仅一行,包含两个整数n(0 <= n <= 10)和k(0<= k<= 10), n 表示礼物的数量,k表示小朋友的数量

输出描述

分法种数,并枚举所有的分法。

测试案例

输入:
3 2

输出:

4
***|
**|*
*|**
|***

代码:

import sys

line = sys.stdin.readline().strip().split()
n = int(line[0])
k = int(line[1])
a = n + k - 1
ans = []
res = ""

def dfs(index, n, k, a, path, res):
    if index == a:
        ans.append(path)
        return
    if n > 0:
        dfs(index + 1, n - 1, k, a, path + "*", res)
    if k > 0:
        dfs(index + 1, n, k - 1, a, path + "|", res)


dfs(0, n, k - 1, a, "", res)

print(len(ans))
for i in range(len(ans)):
    print(ans[i])

N个球放进K个盒子

def put_balls_into_boxes(n, k, list, idx):
    """
    n 个球放进 k 个盒子中,list 表示 k 个盒子, idx 表示当前要放进 list 哪个位置;
    如果 k == 0 :表示只有一个盒子了,则当前这个盒子填上剩下的 n 个
    如果 k > 0 : 则表示对于盒子对于当前位置 idx 可以放置 0 到 n 任意个,然后将
                 剩下的 n - i 个放进 k - 1 个盒子, 盒子还是 list ,位置是 idx + 1
    :param n:
    :param k:
    :param list:
    :param idx:
    :return:
    """
    if k == 0:
        list[idx] = n
        print(list)
        return

    for i in range(n+1):
        list[idx] = i
        put_balls_into_boxes(n-i, k-1, list, idx+1)

n = 5
k = 3
list = [0 for i in range(k)]
put_balls_into_boxes(n, k-1, list, 0)

输出:

[0, 0, 5]
[0, 1, 4]
[0, 2, 3]
[0, 3, 2]
[0, 4, 1]
[0, 5, 0]
[1, 0, 4]
[1, 1, 3]
[1, 2, 2]
[1, 3, 1]
[1, 4, 0]
[2, 0, 3]
[2, 1, 2]
[2, 2, 1]
[2, 3, 0]
[3, 0, 2]
[3, 1, 1]
[3, 2, 0]
[4, 0, 1]
[4, 1, 0]
[5, 0, 0]

更多解释:n个球放入m个盒子,使用程序输出所有的放法? - Milo Yip的回答 - 知乎
https://www.zhihu.com/question/51448931/answer/125907563

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值