华为测试 称砝码
2015-10-28 20:35
357 查看
分析:
设砝码分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……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时候[b]对于第三个循环 就是把a数组的每一个数分别加2*m2,然后在添加到集合中,则a为[/b]
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时候 一次类推
相关文章推荐
- 天气API整理,返回的数据格式为json对象
- [百度面试题] S型层次遍历树
- 对象的命名和实例的命名
- android回调机制例子让你马上明白
- iOS 7大手势
- [47]Permutations II
- unity3d各种OpenFileDialog操作
- CSS盒模型
- 类在JS中与类在java和C++中不同
- LightOJ 1017 - Brush (III) (dp)
- OLAP的学习与实例搭建
- 数据结构 — 5.二叉树层次遍历
- 习题 1-2 温度
- Java:IO流之转换流
- 《大道至简》第五章读后感
- oracle习题SQL语句练习
- 腾讯工作机会内推
- 线程依附性
- git如何merge github forked repository里的代码更新?
- 单片机与LED,开关,的接口设计