用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 ;
}
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 ;
}