poj1664

用DFS算法即可。

思想:(1)按照苹果数递减的方法,从而保证了所排列的情况不会出现重复的现象。

        (2)判断条件(s==n)即所排列的盘子数和总盘子数相等的情况下,比较所放的苹果数是否相等,即 t==m.

        (3)利用count来记录每次排列完比较后的结果,也就是题目所要求的不同分法。

 

poj1664
   
     
#include " iostream "
using namespace std;
int count = 0 ;
int M,m,n;
void DFS( int k, int s, int t) // k表示每次m-1所得到的数,s表示盘子数,t表示苹果总数
{

if ( s == n ){
if (t == m) count ++ ;
return ;
}
int i;
for (i = k;i >= 0 ; i -- ){
if ( t + i <= m )
{
DFS(i, s
+ 1 , t + i);
}
else // 剪枝,即减少搜索次数,可有可无,但会影响运行时间
{
continue ;
}
}
}
int main()
{

int i;
scanf(
" %d " , & M);
while (M -- )
{
count
= 0 ;
scanf(
" %d %d " , & m, & n);
for (i = m;i >= 0 ;i -- )
{
DFS(i,
1 ,i);
}
printf(
" %d\n " ,count);

}
return 0 ;



}

http://poj.org/problem?id=1664

你可能感兴趣的:(poj)