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/archive/2010/12/11/1902789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值