蓝桥杯 算法训练 数的划分 java

问题描述
  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  1,1,5; 1,5,1; 5,1,1;
  问有多少种不同的分法。
输入格式
  n,k
输出格式
  一个整数,即不同的分法
样例输入
7 3
样例输出
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
数据规模和约定
  6<n<=200,2<=k<=6

动态规划题目,当前解可由上一步的结果得出。
分出一个1来,等同i-1分成j-1份,例如"5"分成3份,等同"4"分成2份每种状态再加1, 4(1 3 , 2 2),5(1 1 3 , 1 2 2);
加上i-j,例如3(1 1 1),6(2 2 2):5(1 1 3 , 1 2 2),8(2 2 4 , 2 3 3)
dp[i][j] = dp[i-1][j-1] + dp[i-j][j];

蓝桥杯 算法训练 数的划分 java

import java.util.*;
public class Main {
	public static void main(String args[]) {
		int[][] dp = new int[202][11];
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int k = input.nextInt();
		for(int i = 1;i <= n;i++) {
			for(int j = 1;j <= k;j++) {
				if(j > i)//当份数大于数字时直接跳过
					continue;
				if(j == 1 || j == i)
					dp[i][j] = 1;
				else if(j == 2)//分成两份时份数为数字除二
					dp[i][j] = i/2;
				else
					dp[i][j] = dp[i-1][j-1] + dp[i-j][j];
			}
		}
//		for(int i = 1;i <= n;i++) {
//			for(int j = 1;j <= k;j++) {
//				System.out.print(dp[i][j]+" ");
//			}
//			System.out.println();
//		}
		System.out.println(dp[n][k]);
	}
}