zoukankan      html  css  js  c++  java
  • 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)还是不用的好,毕竟此处的三目运算符也是很容易理解的。
  • 相关阅读:
    Play Framework + ReactiveMongo 环境搭建
    阿里前端二面(笔试/机试)总结
    ES 6 新特性整理
    Javascript Dom 相关知识整理
    Ajax、CORS、Comet和WebSocket
    XHTML 1.0 标签语义
    Javascript知识整理
    Javascript性能优化(一)
    CSS知识整理
    绘制标准的d3图表
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060819.html
Copyright © 2011-2022 走看看