标签:
题目链接:
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; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45027759