题目:1701: 数的划分
题目描述
一个正整数可以划分为多个正整数的和,比如n=3时:
3;1+2;1+1+1;
共有三种划分方法。
给出一个正整数,问有多少种划分方法。
输入
一个正整数n
输出
一个正整数,表示划分方案数
样例输入
3
样例输出
3
提示
n< =100
// 递推求法
import java.util.Scanner;
public class Main {
static int ans=0;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for(int i=1;i<=n;i++) {
f(1,n,i);
}
System.out.println(ans);
}
public static void f(int front,int n,int step) {
if(step==1) {
ans++;
return;
}
for(int i=front;i<=n/step;i++) {
f(i,n-i,step-1);
}
}
}
动态规划写法
import java.util.Scanner;
public class Main {
static int maxsum[][] = new int[102][102];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for(int i=1;i<=n;i++) {
maxsum[i][1]=maxsum[1][i]=1; /// 将i份分成1份,有1种,将1分成i份,有1种
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(i<j) /// 当i<j 时,此时最多分成i份,实际就是将i,分成i份
maxsum[i][j]=maxsum[i][i];
else if(i==j) // 相等时,分两种情况,一种,每份分1,只有一种分法
/// 第二种,至少有一份为零
maxsum[i][j]=maxsum[i][j-1]+1;
else if(i>j)///两种情况
// 至少有一份为零maxsum[i][j-1]
// 将j分出来,再将i-j再分成j份,相等于maxsum[i-j][j]
maxsum[i][j]=maxsum[i-j][j]+maxsum[i][j-1];
}
}
System.out.println(maxsum[n][n]);
}
}