码迷,mamicode.com
首页 > 其他好文 > 详细

NEFU560 半数集【递归】

时间:2015-04-13 16:39:46      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=560


题目大意:

给定一个自然数N,有N开始产生半数集set(N)。set(N)定义如下:

1)N是set(N)中的元素

2)在N的左边自然数,但该自然数不能超过最近添加的数的一半。

3)按照这个规律,直到不能添加自然数为止。

例如:N = 6时,只能添加不超过6/2=3的自然数为1、2、3,即为16、26、36。而26、

36可以继续添加1,即126、136。则set(N) = {6、16、26、126、36、136}。


思路:

递归的添加,设能添加的数的个数为HalfSet(N),可遍历1~N/2,ans += HalfSet(i),递

归得到答案。但是这样显然重复计算了很多相同的问题,用数组shu[]来保存计算结果,递

归的时候,如果存在结果,可直接返回结果值,否则就先计算再返回结果值。


AC代码:

//#include<iostream>
//#include<algorithm>
//#include<cstdio>
//#include<cstring>
//using namespace std;
//
//int HalfSet(int N)
//{
//	int ans = 1;
//	if(N > 1)
//	for(int i = 1; i <= N/2; ++i)
//		ans += HalfSet(i);
//	return ans; 
//}
//
//int main()
//{
//	int N;
//	while(~scanf("%d",&N)) 
//	{
//		printf("%d\n",HalfSet(N)); 
//	}
//	
//	return 0;
//} 

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int shu[11000];

int HalfSet(int N)
{
	int ans = 1;
	if(shu[N])
		return shu[N];
		
	for(int i = 1; i <= N/2; ++i)
		ans += HalfSet(i);
	return shu[N] = ans;
}

int main()
{
	int N;
	while(~scanf("%d",&N))
	{
		printf("%d\n",HalfSet(N));
	} 
	
	return 0;
}


NEFU560 半数集【递归】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45027759

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!