public class Demo {
/*
* 砝码问题: 现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn
* 现在要用这些砝码去称物体的重量,问能称出多少中不同的重量
* 输入: int n:n表示有多少组重量不同的砝码,1<=n<=10 int[] weight:表示n组砝码的重量,1<=mi<=10 int[]
* nums:表示n组砝码的最大数量,1<=xi<=10
* 输出: 只有一个数据,表示利用给定的砝码可以称出的不同的重量数;非法数据输出-1
* 注: 称重重量包括0 要对输入数据进行校验
*/
public static int fama(int n, int[] weight, int[] nums) {
if (n <= 0 || n > 10 || null == weight || null == nums || weight.length != n
|| nums.length != n) {
return -1;
}
for (int temp : weight) {
if (temp < 1 || temp > 10) {
return -1;
}
}
for (int temp : nums) {
if (temp < 1 || temp > 10) {
return -1;
}
}
int i;
HashSet<Integer> set = new HashSet<Integer>();
set.add(0);
HashSet<Integer> tempSet = new HashSet<Integer>();
for (i = 0; i < n;) {
tempSet.add(weight[i]);
for (Integer integer : set) {
tempSet.add(integer + weight[i]);
}
set.addAll(tempSet);
tempSet.clear();
if (0 == --nums[i]) {
i++;
}
}
return set.size();
}
}