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