一、题目
描述
现有一组砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
本题有多组输入
输入描述:
输入包含多组测试数据。
对于每组测试数据:
第一行:n — 砝码数(范围[1,10])
第二行:m1 m2 m3 … mn — 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 … xn — 每个砝码的数量(范围[1,6])
输出描述:
利用给定的砝码可以称出的不同的重量数
二、解题思路
以第一个砝码作为基础,在这个基础上不断添加,例如:砝码1的数量位2,则三种情况:0,1,2;砝码2的数量位1,则两种情况:0,2;在砝码1的3种的基础上,添加砝码2的两种情况,分别为:0,1,2;2,3,4;去掉重复情况,则为0,1,2,3,4。
三、代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = in.nextInt(); // 砝码数
int[] weights = new int[n]; // 砝码重量
int[] nums = new int[n]; // 砝码数量
for (int i = 0; i < n; i++) {
weights[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
int num = diffWeight(n, weights, nums);
System.out.println(num);
}
}
/**
*
* @param n 砝码的数量
* @param weights 砝码的重量数组
* @param nums 砝码的数量数组
* @return
*/
private static int diffWeight(int n, int[] weights, int[] nums) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i <= nums[0]; i++) {
set.add(i*weights[0]);
}
for (int i = 1; i < n; i++) {
List<Integer> list = new ArrayList<>(set);
for (int j = 0; j <= nums[i]; j++) {
for (int k = 0; k < list.size(); k++) {
int weight = list.get(k) + j*weights[i];
set.add(weight);
}
}
}
return set.size();
}
}