问题的描述给定一个自然数n,由n 开始可以依次产生半数集set(n)中的数如下。
(1) n∈set(n);
(2) 在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集。
树的思想:
我们可以这么想: 6
3 2 1
1 1
(1) n∈set(n);
(2) 在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集。
树的思想:
我们可以这么想: 6
3 2 1
1 1
上面这颗树中每一个节点到根节点都是一个答案
#include<stdio.h>
int count=0;
void compute(int n)
{
if(n==0)
return;
count++;
int start=n/2;
for(int i=start;i>=1;i--)//进行分枝
compute(i);
}
void main()
{
int target;
scanf("%d",&target);
compute(target);
printf("%d\n",count);
}