华为OJ——称砝码

来源:互联网 发布:音频矩阵处理器 编辑:程序博客网 时间:2024/06/06 00:01

题目描述

  现有一组砝码,重量互不相等,分别为m1,m2,m3…mn; 每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。

  注:
    称重重量包括0

方法原型:
    public static int fama( int n, int [] weight, int [] nums)

输入描述:
    输入包含多组测试数据。

对于每组测试数据:

    第一行:n — 砝码种类(范围[1,10])

    第二行:m1 m2 m3 … mn — 每个砝码的重量(范围[1,2000])

    第三行:x1 x2 x3 …. xn — 每个砝码的数量(范围[1,6])
输出描述:
    利用给定的砝码可以称出的不同的重量数

示例1
    输入
      2
      1 2
      2 1
    输出
      5

代码实现:

  • 思路:

    ①分配一个数组temp[sum+1],初始化temp[0]和temp[sum]为true
    ②三层for循环:第一层n:表示种类,第二层:每种砝码的个数x,第三层:(int k = sum; k >= m[i]; k–)
    ③对于第三层循环需要判断temp[k - m[i]],若为true则可以将k放入数组

package cn.c_shuang.demo41;import java.util.*;/** * 称砝码 * @author Cshuang * */public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        while (in.hasNextLine()){            int n = Integer.parseInt(in.nextLine()); // n 种砝码            String str1 = in.nextLine();            String str2 = in.nextLine();            System.out.println(getNums(n, str1, str2));        }        in.close();    }    private static int getNums(int n, String s1, String s2) {        String[] s1Arr = s1.split(" ");        String[] s2Arr = s2.split(" ");        int[] m = new int[n];        int[] x = new int[n];        int sum = 0; // 总的重量        for (int i = 0; i < n; i++) {            m[i] = Integer.valueOf(s1Arr[i]); // 每种砝码的重量            x[i] = Integer.valueOf(s2Arr[i]); // 每种砝码的数量            sum += x[i] * m[i];        }        boolean[] temp = new boolean[sum+1];//能测的质量种类,最多是:总质量+1        temp[0] = true;//质量为0,也为true        temp[sum] = true;//质量满了也为true        for (int i = 0; i < n; i++) {//砝码的种类数            for (int j = 0; j < x[i]; j++) {//每种砝码对应的个数                for (int k = sum; k >= m[i]; k--) {//总重量往下减                    //假设k-m[i]为1,即质量为1的值,已经存在temp数组                    //temp[k-m[i]]为true,当前m[i]代表的当前质量,在1的基础上累加是可以的,即累加后的值为k                    //所以可以设置temp[k]=true,后面依次递归                    if (temp[k - m[i]])//递归思想的应用                        temp[k] = true;//若质量相同的会被覆盖,所以不用额外处理相同的质量                }            }        }        int count = 0;        for (int i = 0; i <= sum; i++) {            if (temp[i])                count++;        }//找到temp[]为true的,这是可以被称出来的;        return count;    }}
原创粉丝点击