Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình đếm số cách phân phối n kẹo vào k túi trong Python

Cho n kẹo (mỗi cái unique) và k túi. Tìm số cách phân phối sao cho mỗi túi ít nhất 1 kẹo. Kết quả có thể lớn, trả về số nguyên (không yêu cầu modulo trong bài này).

Ví dụ: n = 3, k = 2 → output = 3. Các cách: (1,2)|(3), (1)|(2,3), (2)|(1,3).

Giải thuật (DP Stirling numbers of the second kind * k!)

Số cách = S(n,k) * k! với S(n,k) là số Stirling loại 2. Quy hoạch động:

  • dp[c][b] = số cách phân c kẹo vào b túi (mỗi túi ≥1).
  • dp[c][b] = dp[c-1][b-1] + dp[c-1][b] * (b+1). (Thêm kẹo c vào túi mới hoặc chèn vào b túi cũ).
  • Kết quả = dp[n-1][k-1] (do index base 0 trong code).

Code Python


def solve(n, k):
    dp = [[1] * n for _ in range(n)]
    for c in range(2, n):
        for b in range(1, min(c, k)):
            dp[c][b] = dp[c-1][b-1] + dp[c-1][b] * (b + 1)
    return dp[n-1][k-1]

print(solve(3, 2))  # 3

Đầu vào / Đầu ra

Input: 3, 2
Output: 3