题解 | #称砝码#

称砝码

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

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 a = in.nextInt();
        //     int b = in.nextInt();
        //     System.out.println(a + b);
        // }
        int n = in.nextInt();
        int[] mn = new int[n];
        int[] xn = new int[n];
        int num = 0;
        int max = 0;
        while (in.hasNextInt()) {
            for (int i = 0; i < n; i++) {
                mn[i] = in.nextInt();
            }
            for (int i = 0; i < n; i++) {
                xn[i] = in.nextInt();
                num = num + xn[i];
            }
        }

        int[] mx = new int[num];
        int index = 0;
        for (int i = 0; i < n; i++) {
            max = max + mn[i] * xn[i];
            for (int j = 0; j < xn[i]; j++) {
                mx[index] = mn[i];
                index++;
            }
        }

        boolean[][] dp = new boolean[num + 1][max + 1];

        for (int i = 0; i <= num; i++) {
            dp[i][0] = true;
        }

        HashSet<Integer> ws = new HashSet<>();
        ws.add(0);
        for (int i = 1; i <= num; i++) {
            int w = mx[i - 1];
            for (int j = 1; j <= max; j++) {
                dp[i][j] = dp[i - 1][j];
                if (j - w < 0) {
                    continue;
                }
                dp[i][j] = dp[i - 1][j - w] || dp[i - 1][j];
                if (dp[i][j]) {
                    ws.add(j);
                }
            }
        }
        System.out.print(ws.size());
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务