題意
求 \(n\) 個一樣的球放到 \(k\) 個盤子裡的方案數(每個盤子至少一個)。
題解
考慮記 \(f(i, j)\) 為結果。
- 我們可以一次性只加一個球(新放到一個盤子裡),也就是可以從 \(f(i - 1, j - 1)\) 轉移過來。
- 也可以用已有的盤子每個盤子放一個球,就是從 \(f(i - j, j)\) 轉移過來。
為什麼不可以從 \(f(i - k, j)\) 或 \(f(i - k, j - k)\) 而 \(1 \le k \lt j\) 轉移過來呢?
因為重複兩次上述操作會導致重複(再說了時間複雜度也不允許……)
時間複雜度 \(\mathcal{O} (nk)\)
namespace zqh {
const int N = 5005;
int n, k;
int dp[N][N];
void init() {
cin >> n >> k;
}
void solve() {
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= min(i, k); j++) {
dp[i][j] = (dp[i - 1][j - 1] + dp[i - j][j]) % mod;
}
}
cout << dp[n][k];
}
void main() {
init();
solve();
}
} // namespace zqh