题目描述:分礼物
圣诞节到了,城堡里有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