题解 | #称砝码#

称砝码

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;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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