WUSTOJ 1269: 划分数
参考博客
题目
将 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();
}
}
代码补充
- Java申请空间之后,会有默认值的,
int
的默认值为0
,因此不用像C/C++
那样赋值为0
。 - 此代码全部都写在了
main
方法里面了,因为构造方法是有点占时间的。(不是我的习惯,我比较喜欢分开。) - Java调用方法也是占时间的,取小方法
Math.min(int a, int b)
还是不用的好,毕竟此处的三目运算符也是很容易理解的。