#include <bits/stdc++.h>
using namespace std;
/*
将要凑出的数看成背包的容量
所有可以用的物品是1~n n个物品
每个物品的体积是 1~n
问题转换为:给定1~n,n个物品,背包容量为n,求装满背包的方案数
由于每个数可以选多次,该问题就是完全背包的问题
DP分析法:
(1)状态表示:f[i,j]
集合:所有从前i个物品选,且总体积恰好是j的所有选择方案的集合
属性:集合中元素的数量
(2)状态计算:
所有不包含第i个物品的方案:f[i-1,j]
所有包含第i个物品的方案:f[i-1,j-k*vi]:可以考虑为第i个物品一定有,那么就转换为在i-1个物品的情况下,凑出背包容量为j-k*vi的方案数
因此:f[i,j] = f[i-1,j] + f[i-1,j-k*vi]
可以用滚动数组优化:
*/
long long base=2147483648LL;//默认数字为int类型,因此数字后要加LL
int n;
long long f[4005];
int main(){
cin>>n;
f[0]=1;
for(int i=1;i<n;i++)
for(int j=i;j<=n;j++)
f[j]=(f[j]+f[j-i])%base;
cout<<f[n];
}
/**************************************************************
Problem: 1903
User: admin
Language: C++
Result: Accepted
Time:156 ms
Memory:2104 kb
****************************************************************/