您的位置:首页 > 其它

POJ 1664 放苹果【DFS/递归】

2015-05-13 18:35 537 查看
因为一瞬间脑子不太清楚,有个地方敲错了,导致了这道水题花了我一些时间,其实很简单....首先想到的是DFS,因为一直在做这个嘛...

DFS代码比较长,好不容易遇到一道容易题,我还剪了剪枝。。。这么水的题,有点多此一举啊

#include<stdio.h>
int m, n;
int total, num;
void dfs( int remain, int pre, int plate);
int main(void){
int i, t;
scanf("%d", &t);
while( t--){
scanf("%d%d", &m, &n);
total = 0;
for( num = 1; num <= n; num++) {					//使用盘子数量
dfs( m, 1, 0);
}
printf("%d\n", total);
}

return 0;
}
void dfs( int remain, int pre, int plate){
int a;
if( plate == num){
if( remain == 0)total++;
return;
}
if( remain < (num-plate) || remain < pre || remain < pre * (num-plate))        // 说明有的盘子是空的 或存在逆序
return;
for( a = pre; a <= remain/(num-plate) + 1; a++){                               // 缩小枚举范围
dfs( remain-a, a, plate+1);
}
return;
}
很多人的DFS都比我写的简单T0T.....

看了看别人的讨论,发现它是一道很简单的递归题,代码非常短。。。有些伤心,以后要多角度考虑问题啊

#include<stdio.h>
int fun( int m, int n){
if( n == 1 || m == 1 || n == 0|| m == 0) return 1;
if( m >= n) return fun( m-n, n) + fun( m, n-1);      // 要么每个盘子放一个,要么有的盘子不放
else return fun(m,m);	                             // 相当于m个苹果m个盘子
}
int main(void){
int i, t, m, n;
scanf("%d", &t);
while( t--){
scanf("%d%d", &m, &n);
printf("%d\n", fun( m, n));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: