方法一:
f[i][j]代表取前i个数,且它们相加的总和为j的方案数
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005, mod = 1e9 + 7;
int f[N][N];
int main(){
int n;
cin>>n;
f[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= n; j++){
f[i][j] = f[i-1][j];
if(j >= i)
f[i][j] = (f[i][j-i] + f[i-1][j]) % mod;
}
}
cout<<f[n][n]<<endl;
return 0;
}
方法二:
思路:对f[i][j]进行优化,降低空间复杂度,用f[j]来表示表示f[i][j]或f[i-1][j]
f[j]表示相加总和为j的方案数
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005, mod = 1e9 + 7;
int f[N];
int main(){
int n;
cin>>n;
f[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= n; j++){
if(j >= i)
f[j] = (f[j-i] + f[j]) % mod;
}
}
cout<<f[n]<<endl;
return 0;
}