输出将k个无差别礼物分配给n个小朋友的所有分法

我的算法思路为遍历所有可能性,感觉有点蠢

import sys
#为小朋友分配礼物
def distribute(giftNum,childNum):
        children = [[[0]*childNum]]
        # children[n]为小朋友们分n个礼物的所有可能分法
        # 如childNum为2时,children[1]=[[1,0],[0,1]]
        # 上一行代码初始化了小朋友们分0个礼物是的情况
        for times in range(1,giftNum+1):
                children.append([])
                # 增加一行用以记录增加一个礼物时的情况
                for prob in range(len(children[times-1])):
                # 遍历少一个礼物时的每一种情况
                # 对于每一种情况,增加一个礼物时会可能出现childNum种新情况
                        for tarChild in range(childNum):
                        # 遍历增加一个礼物后的每一种情况,即该礼物分到各个小朋友手中时产生的情况
                                child = children[times-1][prob].copy()
                                child[tarChild] += 1
                                # 优化速度注释掉如下{
                                # same = False
                                # for i in children[times]:
                                #         if child == i:
                                #                 same = True
                                # }
                                if children[times].count(child) == 0:
                                # 判断该情况是否与之前情况有重合
                                        children[times].append(child)
        return children[giftNum]

if __name__ == "__main__":
    inputLine = sys.stdin.readline().strip().split(" ")
    inputLine = [int(str) for str in inputLine]
    n = inputLine[0]
    k = inputLine[1]
    distribution = distribute(n,k)
    print(len(distribution))
    for prob in distribution:
                count = 0
                for i in prob:
                        print("*"*i,end='')
                        count = count+1
                        if count < k:
                                print("|",end='')
                print()
        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值