1. 题目描述
给定一个整数n,将其无序拆分成最大数为k的拆分数,(n,k不超出100) 要求:所有的拆分方案不重复。
如当n=4,k=4时,一共有5种拆分方案,拆分如下:
(1)4=1+1+1+1
(2)4=1+1+2
(3)4=1+3
(4)4=2+2
(5)4=4
2. 输入格式:
每一行输入一组整数n,k,遇到键盘结束符^Z或文件结束符EOF时结束输入。
3. 输出格式:
按行输出每组的拆分方案数。
4. 输入样例:
4,4
5,4
5. 输出样例:
5
6
import java.util.Scanner;
public class Main {
static int dp[][] = new int[101][101];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
String sn = str.substring(0, str.indexOf(","));
String sk = str.substring(str.indexOf(",") + 1);
int n = Integer.parseInt(sn);
int k = Integer.parseInt(sk);
System.out.println(Split(n, k));
}
}
private static int Split(int n, int k) {
if (dp[n][k] != 0)
return dp[n][k];
if (n == 1 || k == 1) {
dp[n][k] = 1;
return dp[n][k];
} else if (n < k) {
dp[n][k] = Split(n, n);
return dp[n][k];
} else if (n == k) {
dp[n][k] = 1 + Split(n, k - 1);
return dp[n][k];
} else {
dp[n][k] = Split(n, k - 1) + Split(n - k, k);
return dp[n][k];
}
}
}