整数划分
第一种划分
import java.io.*;
public class Main{
static int N=1010;
static int mod=(int)(1e9+7);
static int[][] f=new int[N][N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
for(int i=0;i<=n;i++)f[i][0]=1; //因为如果j等于0的话,什么也不选也是一种情况
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
f[i][j]=(f[i-1][j])%mod;
if(j>=i)f[i][j]+=(f[i][j-i])%mod;
}
System.out.println(f[n][n]);
}
}
一维优化代码:
import java.io.*;
public class Main{
static int N=1010;
static int mod=(int)(1e9+7);
static int[] f=new int[N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
f[j]=(f[j]+f[j-i])%mod;
System.out.println(f[n]);
}
}
第二种划分
import java.io.*;
public class Main{
static int N=1010;
static int mod=(int)(1e9+7);
static int[][] f=new int[N][N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans+f[n][i])%mod;
System.out.println(ans);
}
}