因为一瞬间脑子不太清楚,有个地方敲错了,导致了这道水题花了我一些时间,其实很简单....首先想到的是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;
}