半数集问题-分治
题目:
给定一个自然数,可以在其前面增加大小不超过它本身一半的数字,形成的新数字属于半数集,这个数本身也属于半数集
例如set(6)={6,16,26,126,36,136}
求n得半数集的元素个数
思路:
getset(n)=getset(1)+getset(2)+...+getset(n/2)+1
将原问题分解成了n/2个小问题,这也是分治法的思想
上代码:
1 #include<iostream> 2 using namespace std; 3 int getset(int n) { 4 int ans = 1;//当n不同时,每一个getset(n)都是不同的函数,局部变量ans互相都不关联 5 if (n > 1) { 6 for (int i = 1; i <= n / 2; i++) { 7 ans += getset(i);//将每一步得到的结果加到getset(6)的ans上去 8 } 9 } 10 return ans; 11 } 12 int main() { 13 cout<<getset(6); 14 15 return 0; 16 }