题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
模拟过程如下:
1、如果在称重种类为i,则可以叠加它前面的所有种类组合出来的结果。
2、在i种类范围内要记录能够组合出来的结果
3、根据步骤1、2,算出叠加结果,放置结果集当中.
注意,同一个种类的物品,不要叠加,因为为互斥关系。不能叠加
时间复杂度O(n)
空间复杂度O(n)
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Integer n = Integer.parseInt(in.nextLine()); String[] original = in.nextLine().split(" "); Integer[] weights = convertStringArrayToIntArray(original); original = in.nextLine().split(" "); Integer[] numbers = convertStringArrayToIntArray(original); Set<Integer> set = new HashSet<>(); set.add(0); for (int i = 0; i < weights.length; i++) { //状态1 Set<Integer> setTemp = new HashSet<>(); for (int j = 1; j <= numbers[i]; j++) { int temp = weights[i] * j; set.stream().forEach(((a)-> { setTemp.add(a + temp); })); } set.addAll(setTemp); setTemp.clear(); } System.out.println(set.size()); } public static Integer[] convertStringArrayToIntArray(String[] strArray) { Integer[] intArray = new Integer[strArray.length]; for (int i = 0; i < strArray.length; i++) { intArray[i] = Integer.parseInt(strArray[i]); } return intArray; } }