给定一个自然数 N,要求把 N 拆分成若干个正整数相加的形式,参与加法运算的数可以重复。
注意:
- 拆分方案不考虑顺序;
- 至少拆分成 2 个数的和。
求拆分的方案数 mod2147483648 的结果。
输入格式
一个自然数 N。
输出格式
输入一个整数,表示结果。
数据范围
1≤N≤4000
输入样例:
7
输出样例:
14
2147483648是2的31次方所以答案会暴int所以用unsigned来存储。 最大值为2的32次方-1
集合:所有从前i个物品中选择,且总体积恰好是j的方案数的集合
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4010;
int n;
unsigned f[N];
int res;
int main(){
cin>>n;//把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];//多的溢出就行了,所以不需要多余的取模
}
}
cout<<(f[n]-1)%2147483648u<<endl;
return 0;
}