华为测试 称砝码

分析:

设砝码分别为m1、m2……mn;他们可取的最大数量分别为x1x2……xn 。想获取能称出多少中不同的重量,则需要把它们所有组合情况下分别相加,假设有X中组合,分别相加得到的结果分别为X1,X2...XX。X减去X1到XX中相等的个数。

我们知道 set集合里面不可以存放重复的数,所以可以考虑用hashset来存放各种组合相加得到的结果,最后求得hashset的大小就可以知道能称多少种了。

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);
		int num=scanner.nextInt();
		int []weight=new int[num];
		int []count=new int[num];
		
		for(int i=0;i<num;i++){
			weight[i]=scanner.nextInt();
		}
		for(int i=0;i<num;i++){
			count[i]=scanner.nextInt();
		}
		
		Set<Integer>set=new HashSet<Integer>();
		set.add(0);
		
		for(int i=0;i<num;i++){
			Object[]a=set.toArray();
			for(int j=1;j<=count[i];j++){
				for(int k=0;k<a.length;k++){
					Integer kk=(Integer)a[k]+weight[i]*j;
					set.add(kk);
				}
			}
			
		}
		System.out.print(set.size());
		
	}
}
代码解释

int num=scanner.nextInt();  用来获取有几个不同的砝码。

for(int i=0;i<num;i++){
			weight[i]=scanner.nextInt();
		}
用来存放砝码。

for(int i=0;i<num;i++){
			count[i]=scanner.nextInt();
		}
存放对应砝码的最大数量。

Set<Integer>set=new HashSet<Integer>();
		<strong>set.add(0)</strong>;
		
		for(int i=0;i<num;i++){
			<strong>Object[]a=set.toArray();//把集合转化为数组</strong>
			for(int j=1;j<=<strong>count[i]</strong>;j++){
				for(int k=0;k<a.length;k++){
					Integer kk=(Integer)a[k]+weight[i]*j;
					set.add(kk);
				}
			}
			
		}

1.当 i=0时候

    a[]={0} 数组a中只有0元素同时知道a的长度为1,j=1时候 对于第三个for循环 相当于循环一次。kk=a[0]+m1;即kk=0+m1;然后添加到集合里面,当第二个for循环进行循环      时候 j=1                  kk=0+m1;

              j=2                  kk=0+2 * m1
              j=a[1]=x1        kk=0+x1 * m1

2.当 i=1时候

   a[]={0,m1,2*m1.....x1*m1}  a数组里面有x1+1个数

     j=1时候 对于第三个循环  就是把a数组的每一个数分别加m2,然后在添加到集合中,

a[]={0,     m1,         2*m1        .....   x1*m1,

       m2,  m1+m2,   2*m1+m2   .....   x1*m1+m2    }

 j=2时候对于第三个循环  就是把a数组的每一个数分别加2*m2,然后在添加到集合中,则a为

a[]={0,           m1,                2*m1        .....         x1*m1,         m2,               m1+m2,                2*m1+m2 .....              x1*m1+m2,

        2*m2     m1+2*m2,     2*m1+2*m2   ... x1*m1+2*m2 ,   m2+2*m2,     m1+m2+2*m2,   2*m1+m2+2*m2.....   x1*m1+m2+2*m2    } 

对于第二个循环 就是集合中的每一个数分别加上j*m2,然后添加到集合中



3.当i=2时候 一次类推


          





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值