poj1664

题意:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

分析:dp,我们认为每个盘子所放的苹果数组成的数列是降序的,讨论最后一个盘子放不放苹果,若放则前面每个盘子都放,方法数相当于把每盘方一个之后剩下的m-n个苹果往n个盘子里放,若不放则相当于把m个苹果放入n-1个盘子。

View Code
#include < iostream >
#include
< cstdio >
#include
< cstdlib >
#include
< cstring >
using namespace std;

#define maxn 11

int f[maxn][maxn];

int main()
{
// freopen("t.txt", "r", stdin);
for ( int i = 0 ; i < maxn; i ++ )
f[i][
0 ] = 1 ;
for ( int i = 0 ; i < maxn; i ++ )
f[
0 ][i] = 0 ;
for ( int i = 1 ; i < maxn; i ++ )
for ( int j = 1 ; j < maxn; j ++ )
if (j >= i)
f[i][j]
= f[i][j - i] + f[i - 1 ][j];
else
f[i][j]
= f[j][j];
int t;
int m, n;
scanf(
" %d " , & t);
while (t -- )
{
scanf(
" %d%d " , & m, & n);
printf(
" %d\n " , f[n][m]);
}
return 0 ;
}

你可能感兴趣的:(poj)