给定一个自然数n,由n 开始可以依次产生半数集set(n)中的数如下。
(1) n∈set(n);
(2) 在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。
注意半数集是多重集。
对于给定的自然数n,计算半数集set(n)中的元素个数。
在求解过程中,要求6的半数集就得先求16,26,36的半数集,因此就构成了递归。
#include<iostream>
using namespace std;
int a[1005];//存储已经计算过的数据
int f(int n){//计算数字n的半数集int sum=1;if(a[n]>0)//如果f(n)已经计算过一次了,就不再重复计算 return a[n];for(int i=1;i<=n/2;i++)//前方能加sum+=f(i);a[n]=sum;return sum;
}
int main(){int n;cin>>n;cout<<f(n)<<"n";
}
递归,T(n)=T(n/2),时间复杂度为O(n)
本文发布于:2024-01-29 14:32:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650998115953.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |