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

原文地址:https://www.cnblogs.com/FCWORLD/p/1902789.html