Description
一个自然数 n 的一个半数展开是指自然数序列 { a1, a2, …, ak-1, ak }, 其中 ak = n, 2*ai ≤ ai+1, i = 1, 2, …, k-1. 如: n = 24, 那么 { 1, 3, 6, 12, 24 } 和 { 1, 2, 24 } 都是 24 的一个半数展开. 将 n 的一个半数展开序列由后往前取第 i(i=1 ,…, k-1) 项到第 k 项头尾连结将得到一个新的序列, 称之为 n 的一个半数添加序列. 如由 24 的半数展开序列 { 1, 2, 24 } 可以生成相应的半数添加序列 { 1224, 224 }. 由 { 1, 3, 6, 12, 24 } 生成的半数添加序列为 { 1361224, 361224, 61224, 1224 }.
将 n 以及 n 的所有半数添加序列合并起来将得到一个多重集, 称之为 n 的半数集, 记为 halfset(n).
本题对于任意给定的自然数 n, 请计算其半数集 halfset(n) 的元素个数.
Input
有多个测试用例. 每个测试用例由一个自然数 n(n < 1000) 组成. 输入直至没有数据为止.
Output
对于每个测试用例输出一行包含一个整数, 此整数表示 halfset(n) 的元素个数.
Sample Input
6
Sample Output
6
分析
1 {1} 0
2 {1,2} {12} 1
3 {1,3} {13} 1
4 {1,2,4} {1,4} {124,24,14} 3=0+1+1+1=dp[(i/2)]+1+dp[(i/2)-1]+1+…+dp[1]+1
5 {1,2,5} {1,5} {125,25,15}
6 {1,2,6} {1,3,6} {1,6}
6=
代码
#include<iostream>
using namespace std;
int dp[1001];
int main() {
dp[1] = 0;
dp[2] = 1;
dp[3] = 1;
for (int i = 4; i < 1000;++i) {
for (int j = i / 2; j >= 1;--j) {
dp[i] += dp[j] + 1;
}
}
int n;
while(cin>>n) {
cout << (dp[n]+1) << endl;
}
return 0;
}