题解 | #称砝码#不能直接in.nextInt 空指针异常

称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

import java.util.*;//模板
public class Main {
    public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		// 注意 hasNext 和 hasNextLine 的区别
		while (in.hasNextLine()) { // 注意 while 处理多个 case
			
			//砝码种类
			String nstr=in.nextLine();
			int n=Integer.parseInt(nstr);//不能直接in.nextInt 空指针异常,不知道为什么,评论区解释一下
			
			//各砝码重量
			String[] wsSting = in.nextLine().split(" ");
			int[] ws = new int[n];
			for (int i = 0; i < wsSting.length; i++) {
				ws[i] = Integer.parseInt(wsSting[i]);
			}
			
			String[] numsSting = in.nextLine().split(" ");			
          	//各砝码个数
			int[] nums = new int[n];
			for (int i = 0; i < numsSting.length; i++) {
				nums[i] = Integer.parseInt(numsSting[i]);
			}
			
          	//所有砝码重量组合情况set,去重且排好序     ----- 可扩展为有序输出可称重量的数值
			Set<Integer> treeSet = new TreeSet<>();
            //由示例可知,0重量也属于一种情况
			treeSet.add(0);
			//每一种砝码
			for (int i = 0; i < n; i++) { 
              	//前i种砝码组合出的重量,treeSet可看作成员变量,treeSeti 看作临时变量
				Set<Integer> treeSeti = new TreeSet<>(treeSet);
				//第i种砝码取多少个
				for (int k = 1; k <= nums[i]; k++) { 
                  	//i种砝码取k个的重量
                    int w_add = ws[i] * k;
                    //遍历前i种砝码组合treeSeti,在第i+1种下挨个计算
                    for (Integer w : treeSeti) {
						//+第i+1种的k个到总数集合treeSet,不是treeSeti
                    	int new_w= w+w_add;
                    	treeSet.add(new_w);
                    }
                }
			}
			System.out.println(treeSet.size());
		}
	}
}

全部评论

相关推荐

11-17 23:00
南昌大学 Java
这个名称和你无缘:10元一天 0元提成😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务