-
称砝码:
现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。*****注:称重重量包括0
-
解题关键:
【意识到迭代逻辑,n个砝码能够称重的重量数一定是基于n-1个砝码称重数的基础上的】
利用集合去重的性质,用set缓存能得到的称重重量,以示例为例,先在集合里面添加0,
当第一个砝码进来的时候;
{0} 变成 {0,0+1} -> {0,1}
当第二个砝码进来之后;
{0,1} 变成 {0,1,0+1,1+1} --> {0,1,2}
当第三个砝码进来之后;
{0,1,2} 变成{0,1,2,0+2,1+2,2+2} —> {0,1,2,3,4}
最终set集合中的元素个数即为能称出的重量种数。 -
示例:
输入:
2
1 2
2 1
输出:
5
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int[] weight=new int[n];
int[] index=new int[n];
for(int i=0;i<n;i++){
weight[i]=in.nextInt();
}
for(int i=0;i<n;i++){
index[i]=in.nextInt();
}
Set<Integer> set=new TreeSet<>();
set.add(0);//初始值设个0,刚开始set里面没有数据,设个0,跟其他的数据好加起来
for(int i=0;i<n;i++){
ArrayList<Integer> list=new ArrayList<>(set);
for(int j=0;j<=index[i];j++){//这里注意砝码数量是可以等于index[i]的
for(int k=0;k<list.size();k++){
int wweight=weight[i]*j;//假设种类i砝码有j个,从砝码数量j=0加至j=index[i]
int setweight=list.get(k);//遍历set中全部的数量,加上当前i种类,j个砝码的重量.
int sum=wweight+setweight;
set.add(sum);
}
}
}
System.out.print(set.size());
}