描述 |
现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。 注: 称重重量包括0 要对输入数据进行校验 方法原型:public static int fama(int n, int[] weight, int[] nums) |
---|---|
知识点 | 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 |
int n:n表示有多少组重量不同的砝码,1<=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<> int[] weight:表示n组砝码的重量,1<=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<> int[] num:表示n组砝码的最大数量,1<=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<> |
输出 |
利用给定的砝码可以称出的不同的重量数 |
样例输入 | 2 1 2 2 1 |
样例输出 | 5 |
package com.oj5; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; public class Test { public static void main(String[] args) { Scanner in = new Scanner(System.in); int num = in.nextInt(); int[] weights = new int[num]; int[] nums = new int[num]; int[] flag = new int[1001]; for(int i = 0;i < num; i++){ weights[i] = in.nextInt(); } for(int i = 0;i < num; i++){ nums[i] = in.nextInt(); } // for(int i = 0;i < flag.length; i++) // System.out.println(flag[i]); flag[0] = 0; for(int i = 0;i < num; i++) for(int j = 1;j <= nums[i]; j++){ //循环砝码个数次数,每次增加一个重量为weights[i]的新砝码 int max = flag[0]; for(int k = 1;k <= flag[0]; k++){ //新添加一个砝码同以前的已有重量合成的新重量,从1到已有的最大重量开始,添加一个weights[i]重量砝码,看看是否有新重量出现 if(flag[k]==1&&flag[k+weights[i]]==0){ flag[k+weights[i]] = 1; if(k+weights[i]>max) max=k+weights[i]; } } flag[j*weights[i]] = 1; //单纯j个质量为weight[i]的砝码放在一起产生的新重量 flag[0] = max> (j*weights[i])?max:j*weights[i]; } int count = 1; for(int i = 0;i < flag.length; i++) if(flag[i]==1) count++; System.out.println(count); } }