n个球放入k个桶,每个桶不超过m个球,至少1个, 请问有多少种方法

58 阅读1分钟
# n:球的个数  k是桶的个数  m是限制每个桶最多放入球的个数
# Given n balls, k buckets, and m is a limit
n = 10
k = 6
m = 2

# dp[i][j]: 前i个桶,放入j个球的方案数,每个桶放入的球数量a满足条件1<=a<=m
# The number of ways to place j balls into the first i buckets,
# where the number of balls placed in each bucket, denoted by 'a', satisfies the condition 1 <= a <= m
dp = [[0 for i in range(n + 1)] for j in range(k + 1)]

# 桶的编号从1开始,这里是对边界条件进行初始化
# The bucket numbering starts from 1. Here, we are initializing the first bucket
for j in range(1, m + 1):
    dp[1][j] = 1

# 从2号桶到k号桶进行遍历
for i in range(2, k + 1):
    for j in range(i, min(m * i, n) + 1):
        for z in range(1, m + 1):
            if i - 1 <= j - z<= m*(i-1):
                dp[i][j] += dp[i - 1][j - z]
            elif i-1 > j - z:
                break
        print(rf"dp[{i}][{j}]  {dp[i][j]}")

print(dp[k][n])