半數集問題描述:
給定一個自然數n,由n 開始可以依次產生半數集set(n)中的數如下。
(1) n∈set(n);
(2) 在n 的左邊加上一個自然數,但該自然數不能超過最近添加的數的一半;
(3) 按此規則進行處理,直到不能再添加自然數爲止。
例如,set(6)={6,16,26,126,36,136}。半數集set(6)中有6 個元素。
注意半數集是多重集。
對於6的半數集來說,可以在6前加1,2,3,而在2的前面可以加1,3的前面可以加1,2,這是一個遞歸的過程。
#include<bits/stdc++.h>
using namespace std;
int sum = 1;
int n;
void dfs(int now)
{
for(int i=1;i<=now/2;i++)
{
sum++;
dfs(i);
}
}
int main()
{
scanf("%d",&n);
dfs(n);
printf("%d",sum);
}