1. 题目描述
对于给定的 n n n种砝码,重量互不相等,依次为 m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1,m2,...,mn,数量依次为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,
现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。特别地,称重重量包括0。
输入描述:
第一行输入一个整数
n
(
1
≦
n
≦
10
)
n (1≦n≦10)
n(1≦n≦10)代表砝码的个数。
第二行输入
n
n
n 个整数
m
1
,
m
2
,
.
.
.
,
m
n
(
1
≤
m
1
≤
2000
)
m_1,m_2,...,m_n(1 \leq m_1 \leq2000)
m1,m2,...,mn(1≤m1≤2000)代表每种砝码的重量。
第三行输入
n
n
n 个整数
x
1
,
x
2
,
.
.
.
,
x
n
(
1
≤
x
i
≤
10
)
x_1, x_2,...,x_n(1 \leq x_i \leq 10)
x1,x2,...,xn(1≤xi≤10) 代表每种砝码的数量。
输出描述:
输出一个整数,代表利用给定的砝码可以称出的不同的重量数。
示例1:
输入:2
1 2
2 1
输出:5
说明:在这个样例中,有 2 个重量为 1 的砝码,1 个重量为 2 的砝码。称重方式如下:
- 不放砝码,称重重量为 0 ;
- 放 1 个重量为 1 的砝码,称重重量为 1 ;
- 放 2 个重量为 1 的砝码,称重重量为 2 ;
- 放 1 个重量为 1 的砝码、1 个重量为 2 的砝码,称重重量为 3 ;
- 放 2 个重量为 1 的砝码、1 个重量为 2 的砝码,称重重量为 4 。
因此,能称出的不同重量有 5 种,分别是 0,1,2,3,4 。
2. 思路
- 将当前砝码,依据从1开始逐步累加到原有的数量,得到的结果放到set中(避免重量重复)
- 后面的砝码一次与前面砝码出现的重量结果进行依次累加,放入set中,重复的重量不需要计入
- 初始化set中的元素要考虑0的情况。
3. 代码
注意遍历set的时候,如果还要修改,需要重新开辟一个副本来存储数据,否则会报错:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();//不同重量砝码个数
int[] m = new int[n];
int[] x = new int[n];
//重量
for (int i = 0; i < m.length; i++) {
m[i] = in.nextInt();
}
//数量
for (int i = 0; i < x.length; i++) {
x[i] = in.nextInt();
}
HashSet<Integer> possibleWeight = new HashSet<>();
possibleWeight.add(0);//0也是一种可能性
for (int i = 0; i < n; i++) {
HashSet<Integer> currentSet = new HashSet<>(possibleWeight);
for (int j = 1; j <= x[i]; j++) {
for (Integer weight : currentSet) {
possibleWeight.add(weight + m[i]*j);
}
}
}
System.out.println(possibleWeight.size());
}
}
以上为个人学习分享,如有问题,欢迎指出:)