题意:把n个一样的蛋糕放进m个一样的盘子,有多少种方法。
分析:dp,f[i][j]表示i个盘子装j个蛋糕的方法数。分两种情况,有空盘方法数为f[i - 1][j](撤掉一个空盘),无空盘的方法数为f[i][j - i](每个盘子撤掉一个蛋糕)。采用滚动数组。
View Code
#include#include #include #include using namespace std; #define maxn 4505 #define w 1000000007 int n, m; int f[2][maxn]; int main() { //freopen("t.txt", "r", stdin); scanf("%d%d", &m, &n); if (m > n) m = n; for (int i = 1; i <= n; i++) f[1][i] = 1; f[0][0] = f[1][0] = 1; for (int i = 2; i <= m; i++) { for (int j = 1; j <= n; j++) f[i & 1][j] = f[(i - 1) & 1][j]; for (int j = i; j <= n; j++) f[i & 1][j] = (f[i & 1][j] + f[i & 1][j - i]) % w; } printf("%d\n", f[m & 1][n]); return 0; }