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