题目描述:
现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
注:称重重量包括0
输入描述:
输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])
输出描述:
利用给定的砝码可以称出的不同的重量数
思路:
输入砝码种类n;
输入砝码质量w[i];
输入砝码个数c[i];
输出 可以拼凑的质量个数
w1 w2 w3 w4 ...... wn
c1 c2 c3 c4 ...... cn
对于前i个砝码:
不同质量为Q[i]
Q[i]=Q[i-1]+k*w[i]; -->0<=k<=c[i];
Q[i]在Q[i-1]的基础上,对Q[i-1]个不同的重量,分别添加k个砝码i;在添加的过程中去除重复情况
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
int n = scanner.nextInt();
int[] weight = new int[n];
int[] num = new int[n];
for (int i = 0; i < n; i++)
weight[i] = scanner.nextInt();
for (int i = 0; i < n; i++)
num[i] = scanner.nextInt();
Set<Integer> set = new HashSet<>();
for (int i = 0; i <= num[0]; i++)
set.add(weight[0] * i);
for (int i = 1; i < n; i++)
{
ArrayList<Integer> list = new ArrayList<>(set);
for (int j = 1; j <= num[i]; j++)
{
for (int k = 0; k < list.size(); k++)
set.add(list.get(k) + weight[i] * j);
}
}
System.out.println(set.size());
}
}
}