1269: 划分数(Java)

WUSTOJ 1269: 划分数

参考博客

果7的博客

题目

  将 1 个数 n 分成 m 份,求划分的种数。更多内容点击标题。

分析

  唯一需要注意的地方是不考虑顺序。其他的直接看代码即可。

代码

/**
 * 用时:1320ms
 * @author PengHao
 * @version A1.0
 * @date 2019年4月18日 下午9:40:56
 */
 
import java.util.Scanner;

public class Main {

	private Scanner sc;
	private int n, m; // 整数n,分成m份
	private int count; // 种数

	public Main() {
		sc = new Scanner(System.in);
		while (sc.hasNext()) {
			n = sc.nextInt();
			m = sc.nextInt();
			count = 0; // 计数
			divide(n, m, 1);
			System.out.println(count);
		}
		sc.close();
	}

	/**
	 * 划分
	 * 
	 * @param a   整数
	 * @param b   分成b份
	 * @param min 本次划分最小取值
	 */
	private void divide(int a, int b, int min) {
		int max = a / b; // 本次划分的最大值
		// i表示本次划分的数
		for (int i = min; i <= max; i++) {
			if (2 == b) {
				count++; // 这是最后一次划分,直接加1
				continue; // 进入循环
			}
			divide(a - i, b - 1, i); // 继续划分下一层
		}
	}

	public static void main(String[] args) {
		new Main();
	}

}

  看完了?别嘚瑟。注意到用时没?用了1320ms。妈耶,一看不对劲,然后就搜到了参考博客,于是就用Java写了一遍(相对于【果7的博客】做了部分改进)。
  这个题是有递推公式的:count[i][j] = count[i - 1][j - 1] + count[i - j][j]。代码如下:

/**
 * 用时:296ms
 * @author PengHao
 * @version A2.1
 * @date 2019年4月18日 下午11:49:47
 */

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[][] count = new int[201][7];
		count[1][1] = 1;
		int min;
		for (int i = 2; i <= 200; i++) {
			min = i < 6 ? i : 6;
			for (int j = 1; j <= min; j++) {
				count[i][j] = count[i - 1][j - 1] + count[i - j][j];
			}
		}
		int n, m;
		while (sc.hasNext()) {
			n = sc.nextInt();
			m = sc.nextInt();
			System.out.println(count[n][m]);
		}
		sc.close();
	}

}

代码补充

  1. Java申请空间之后,会有默认值的,int的默认值为0,因此不用像C/C++那样赋值为0
  2. 此代码全部都写在了main方法里面了,因为构造方法是有点占时间的。(不是我的习惯,我比较喜欢分开。)
  3. Java调用方法也是占时间的,取小方法Math.min(int a, int b)还是不用的好,毕竟此处的三目运算符也是很容易理解的。
posted @ 2019-04-19 08:39  wowpH  阅读(168)  评论(0编辑  收藏  举报