题解 | #购物单# java

购物单

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int money = sc.nextInt(); // 总钱数
        int n = sc.nextInt(); // 商品数
        Map<Integer, Product> productMap = new HashMap<>();
        int[][] arr = new int[n][3];
        for (int i = 0; i < n; i++) {
            int v = sc.nextInt();
            int p = sc.nextInt();
            int q = sc.nextInt();
            arr[i][0] = v; // 价格
            arr[i][1] = p; // 重要度
            arr[i][2] = q; // 标识
            if (q == 0) {
                productMap.put(i + 1, new Product(v, p));
            }
        }
        for (int[] ints : arr) {
            int index = ints[2];
            if (index != 0) {
                int count = productMap.get(index).count++;
                if (count == 1) {
                    productMap.get(index).firstPrice = ints[0];
                    productMap.get(index).firstValue = ints[1];
                } else {
                    productMap.get(index).secondPrice = ints[0];
                    productMap.get(index).secondValue = ints[1];
                }
            }
        }
        Product[] products = new Product[productMap.size()];
        int index = 0;
        for (Integer integer : productMap.keySet()) {
            products[index++] = productMap.get(integer);
        }

        int[] dp = new int[money + 1];


        for (int i = 0; i < products.length; i++) { // 物品
            Product product = products[i];
            for (int j = money; j >= product.price; j--) { // B背包
                dp[j] = Math.max(dp[j], dp[j - product.price] + product.price *
                                 product.value); // 主件单独
                if (product.count >= 1) {
                    if (j >= product.price + product.firstPrice) {
                        dp[j] = Math.max(dp[j], dp[j - product.price - product.firstPrice] +
                                         product.price * product.value + product.firstPrice * product.firstValue);
                    }
                    if (j >= product.price + product.secondPrice) {
                        dp[j] = Math.max(dp[j], dp[j - product.price - product.secondPrice] +
                                         product.price * product.value + product.secondPrice * product.secondValue);
                    }
                }
                if (product.count == 2 &&
                        j >= product.price + product.firstPrice + product.secondPrice) {
                    dp[j] = Math.max(dp[j], dp[j - product.price - product.firstPrice -
                                               product.secondPrice] +
                                     product.price * product.value + product.firstPrice * product.firstValue +
                                     product.secondPrice * product.secondValue);
                }
            }
        }

        System.out.println(dp[money]);
    }
}

class Product {
    public int count; // 附件的个数
    public int price; // 主件价格
    public int value; // 主件重要度
    public int firstPrice; // 附件1价格
    public int firstValue; // 附件1重要度
    public int secondPrice; // 附件2价格
    public int secondValue; // 附件2重要度

    public Product(int price, int value) {
        this.price = price;
        this.value = value;
    }
}

全部评论

相关推荐

牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务