题目描述
现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。称重重量包括0。
输入描述:
输入包含多组测试数据,对于每组测试数据:
第一行: 砝码数 n
第二行: 每个砝码的重量 m1 m2 m3 ... mn
第三行:每个砝码的数量 x1 x2 x3 ... xn
输出描述:
利用给定的砝码可以称出的不同的重量数
示例:
输入:
2
1 2
2 1
输出: 5
思路:
从第1个砝码开始算起,对于前i个砝码能够称出的重量为dp[i],dp[i]的算法应该是在前i - 1个砝码能够称出的每个重量基础上加上k个砝码i,k的取值范围从1到i砝码的数量,再去掉重复的重量。
用list存储每一个能够称出的重量,然后对于每一个砝码遍历list中的每一个重量,在这些重量基础上加上k个砝码i的重量,如果重量不重复则加入list中。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] weight = new int[n];
int[] number = new int[n];
for(int i = 0; i < n; i++){
weight[i] = sc.nextInt();
}
for(int i = 0; i < n; i++){
number[i] = sc.nextInt();
}
ArrayList<Integer> list = new ArrayList<>();
list.add(0);
for(int i = 0; i < n; i++){
int size = list.size();
for(int j = 0; j < size; j++){
for(int k = 1; k <= number[i]; k++){
if(!list.contains(k * weight[i] + list.get(j)))
list.add(k * weight[i] + list.get(j));
}
}
}
System.out.println(list.size());
}
}
}