题解 | #整数拆分#
整数拆分
https://www.nowcoder.com/practice/376537f4609a49d296901db5139639ec
//二维数组过大,爆空间!
//#include <iostream>
//#include <algorithm>
//
//using namespace std;
//
//const int N = 10010, mod = 1000000000;
//
//int n;
//int f[N][N];
//
//int main()
//{
// cin >> n;
// for(int i=0;i<=n;i++) f[i][0] = 1;
// int i;
// for (i = 1; i <= n; i *= 2 )
// for (int j = 0; j <= n; j ++ )
// {
// f[i][j] = f[i/2][j];
// if(j >= i)
// f[i][j] = (f[i/2][j] + f[i][j - i]) % mod;
// }
// cout << f[i/2][n] << endl;
//
// return 0;
//}
//
#include <iostream>
#include <algorithm>
using namespace std;
//类比于完全背包问题
const int mod = 1000000000,N=1000000;
int n;
int f[N];
int main()
{
cin >> n;
f[0] = 1; //如果要求结果为0,只有一种方案,即什么也不选
for(int i=1;i<=n;i *= 2)
for(int j=i;j<=n;j++)
f[j] = (f[j]+f[j-i]) % mod;
cout << f[n];
return 0;
}
