题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
把每一行中的数值取出来的方式怎么都是错的。后面参考了别人将数据写进去的方式。
思路是:
1.先求出每个物品的数量和质量。
2.将数量保存进一个去重set中。
3。遍历物品i的数量。将set中已有的值与这个物品累加后依次相加。假设现在set中有数组[3,4,6]。有一个物品i的质量为2,这个物品i的数量为3.则需要将set的值分别与(2,4,6)进行累加。
import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case // 数量 int n = in.nextInt(); // 初始化一个0进去 Set set=new HashSet<>(); set.add(0); // 重量集合 int[] weights = new int[n]; int[] nums = new int[n]; for (int i = 0; i < n; i++) { weights[i] = in.nextInt(); } for (int i = 0; i < n; i++) { nums[i] = in.nextInt(); } for (int i=0;i<n;i++) { // 第i个物品对应的重量 int wight = weights[i]; // 第i个物品对应数量 int num = nums[i]; List<Integer> list =new ArrayList<>(set); for(int j=1;j<=num;j++) { // 与已有不重复的数据做加法 for(int res:list) { // 遍历每一个相同质量的砝码,根据砝码的数量相乘依次与已有数据进行累加 // 比如砝码质量2,有三个,则需要把之前的分别与(2,4,6进行累加) set.add(res+ (wight*j)); } } } System.out.println(set.size()); } } }