题目传送门
一、深度优先搜索
#include <bits/stdc++.h>
using namespace std;
int n;
//毫不意外,只通过了5个测试点,TLE了15个点~
int dfs(int x) {
//1就没法继续分了,同时,由于题目说:原数列不做任何修改就直接统计为一种合法数列。所以返回1
if (x == 1) return 1;
//不是1,可以分
int ans = 1;//它自己就是一种
//在它后面不断加入[1,x/2]的数字,都可以增加方法数量
for (int i = 1; i <= x / 2; i++) ans += dfs(i);
//返回方法数量
return ans;
}
int main() {
//输入
cin >> n;
//计算并输出
cout << dfs(n) << endl;
return 0;
}
二、记忆化搜索
#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 1010;
int f[N];
int dfs(int x) {
//存在就返回
if (f[x]) return f[x];
//1就没法继续分了,同时,由于题目说:原数列不做任何修改就直接统计为一种合法数列。所以返回1
if (x == 1) return f[x] = 1;
//不是1,可以分
int ans = 1;//它自己就是一种
//在它后面不断加入[1,x/2]的数字,都可以增加方法数量
for (int i = 1; i <= x / 2; i++) ans += dfs(i);
//返回方法数量
return f[x] = ans;
}
int main() {
//输入
cin >> n;
//计算并输出
cout << dfs(n) << endl;
return 0;
}
三、递推
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int f[N];
int n;
int main() {
//输入
cin >> n;
//边界条件:1
f[1] = 1;
for (int i = 2; i <= n; i++) {
//任何数字,独立成为一个
f[i] = 1;
//所有从1到它的一半的,都可以增加进来
for (int j = 1; j <= i / 2; j++) f[i] += f[j];
}
//总个数
cout << f[n] << endl;
return 0;
}