题解 | #称砝码#动态规划

称砝码

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

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int[] weights = new int[n];
            int[] quantities = new int[n];

            for (int i = 0; i < n; i++) {
                weights[i] = scanner.nextInt();
            }

            for (int i = 0; i < n; i++) {
                quantities[i] = scanner.nextInt();
            }

            int result = countDistinctWeights(weights, quantities);
            System.out.println(result);
        }
    }

    public static int countDistinctWeights(int[] weights, int[] quantities) {
        int maxWeight = 0;
        for (int i = 0; i < weights.length; i++) {
            maxWeight += weights[i] * quantities[i];
        }

        boolean[] dp = new boolean[maxWeight + 1];
        dp[0] = true;

        for (int i = 0; i < weights.length; i++) {
            for (int j = maxWeight; j >= weights[i]; j--) {
                for (int k = 1; k <= quantities[i] && k * weights[i] <= j; k++) {
                    dp[j] |= dp[j - k * weights[i]];
                }
            }
        }

        int count = 0;
        for (boolean value : dp) {
            if (value) {
                count++;
            }
        }

        return count;
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务