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)还是不用的好,毕竟此处的三目运算符也是很容易理解的。

转载于:https://www.cnblogs.com/wowpH/p/11060819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值