POJ 1664 放苹果【DFS/递归】

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值