本文主要是介绍NEFU560 半数集【递归】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
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 半数集【递归】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!