跑步
题目描述
路人甲准备跑 n n n 圈来锻炼自己的身体,他准备分多次( > 1 \gt1 >1)跑完,每次都跑正整数圈,然后休息下再继续跑。
为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多。
可以假设他刚开始跑了 0 0 0 圈,那么请问他可以有多少种跑完这 n n n 圈的方案?
输入格式
一行一个整数,代表 n n n。
输出格式
一个整数表示跑完这 n n n 圈的方案数。
样例 #1
样例输入 #1
212
样例输出 #1
995645335
提示
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 5 ≤ n ≤ 500 5\le n\le 500 5≤n≤500。
思路
- 我们把n圈看成背包容量,每次圈数看成物品容量(也就是背包体积,这里的背包体积跟圈数有关——跟物品组有关),背包的价值就是方案数。
- 然后我们就可以像 买书 那道题类似的写法和分析来做啦。
代码
#include<iostream>
#define int long long
using namespace std;
const int N = 510;
int f[N];
int n;
signed main() {
cin >> n;
f[0] = 1;
for (int k = 1; k <= n; k++) {
for (int j = n; j >= k; j--) {
f[j] += f[j - k];
}
}
cout << f[n] - 1;
return 0;
}