poj3014

题意:把n个一样的蛋糕放进m个一样的盘子,有多少种方法。

分析:dp,f[i][j]表示i个盘子装j个蛋糕的方法数。分两种情况,有空盘方法数为f[i - 1][j](撤掉一个空盘),无空盘的方法数为f[i][j - i](每个盘子撤掉一个蛋糕)。采用滚动数组。

View Code
#include <iostream>
#include
<cstdlib>
#include
<cstring>
#include
<cstdio>
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;
}

你可能感兴趣的:(poj)