题解 | #购物单#

购物单

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

看了前面大佬的C++题解,写了一份Java版的

import java.util.*;
public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while (sc.hasNextLine()) {
                int money = sc.nextInt();
                int m = sc.nextInt();
                sc.nextLine();
                money /= 10;
                int[][] prices = new int[m+1][3];
                int[][] weights = new int[m+1][3];
                for (int i = 1; i <= m; i++) {
                    int a = sc.nextInt();
                    int b = sc.nextInt();
                    int c = sc.nextInt();
                    a /= 10;//price
                    b = b * a;//weight
                    if (c == 0) {
                        // 主件
                        prices[i][0] = a;
                        weights[i][0] = b;
                    } else if (prices[c][1] == 0) {
                        // 附件1
                        prices[c][1] = a;
                        weights[c][1] = b;
                    } else {
                        // 附件2
                        prices[c][2] = a;
                        weights[c][2] = b;
                    }
                    sc.nextLine();
                }
                int[][] dp = new int[m+1][money+1];
                for (int i = 1; i <= m; i++) {
                    for(int j = 1; j <= money; j++) {
                        int a = prices[i][0];
                        int b = weights[i][0];
                        int c = prices[i][1];
                        int d = weights[i][1];
                        int e = prices[i][2];
                        int f = weights[i][2];
                        
                        dp[i][j] = j - a >= 0 ? Math.max(dp[i-1][j], dp[i-1][j-a] + b) : dp[i-1][j];
                        dp[i][j] = j-a-c >= 0 ? Math.max(dp[i][j], dp[i-1][j-a-c] + b + d):dp[i][j];
                        dp[i][j] = j-a-e >= 0 ? Math.max(dp[i][j], dp[i-1][j-a-e] + b + f):dp[i][j];
                        dp[i][j] = j-a-c-e >= 0 ? Math.max(dp[i][j], dp[i-1][j-a-c-e] + b +d + f):dp[i][j];
                    }
                }
                
                System.out.println(dp[m][money] * 10);
            }
        }
}
全部评论
最后那些max是在干啥啊
1 回复 分享
发布于 2022-07-25 13:59
题目都看不懂
1 回复 分享
发布于 2022-07-25 23:22
题目都没看懂是不是没救了
1 回复 分享
发布于 2022-06-17 11:05
这样的还算是中等题,我麻了
3 回复 分享
发布于 2022-10-11 17:30 江苏
这个题解比Naruto的直白清爽一点,Naruto的题解创造商品类来存储数据属实把人绕进去了,还有各种意义不明的缩写。。。这个题解就是直接将价格、满意度、是否为附件标志写入数组,看上去都好理解一点
2 回复 分享
发布于 2022-10-15 17:59 英国
很厉害的代码,初看几分钟大致思路理解了,就是当时觉得这代码有点贪心的意思在里面,所以觉得可能会存在最终结果陷入局部最优的情况。分析了大概1个小时,验证了结果是没问题的。我觉得理解上面代码最关键的就是dp[i][j]里i和j的含义。我个人的理解是,i代表可以购买前i种货物,j代表你有的总钱数。ij取最大,代表所有种类货物都考虑且钱为题目钱数时的结果。理顺逻辑的话,可以从第一个货物开始思考,因为递归的起点是只考虑第一种货物。
1 回复 分享
发布于 2023-03-20 21:20 湖北
妙啊
点赞 回复 分享
发布于 2022-01-23 17:53
妙呀
点赞 回复 分享
发布于 2022-03-02 15:47
输入: 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 复制 输出: 2200 这个输出没有看明白,不应该是800*2+400*3+500*2么?
点赞 回复 分享
发布于 2022-03-02 16:20
妙啊
点赞 回复 分享
发布于 2022-04-08 11:48
这个很强
点赞 回复 分享
发布于 2022-04-22 16:29
膜拜大佬
点赞 回复 分享
发布于 2022-06-09 09:31
感觉你的和前面的大佬不一样啊
点赞 回复 分享
发布于 2022-06-14 17:18
money /= 10; 以及下面的 a/=10 是什么意思呀
点赞 回复 分享
发布于 2022-08-10 11:00
为什么要new int[m+1][3],哪个大佬现身教教小白
点赞 回复 分享
发布于 2022-09-01 21:39 广东
简介明了
点赞 回复 分享
发布于 2022-10-19 11:17 北京
这个题那几个连续的dp赋值就是优中选优的过程 很妙 如果对代码整体不知道为啥这么写的建议去B站看一下labuladong讲的背包问题就懂了
点赞 回复 分享
发布于 2023-01-07 10:37 湖北
2000 6 100 5 1 =ok 90 5 1 =ok 300 1 0 1800 2 0 =ok 1400 2 0 50 5 1 =ng 4350 =ng 4550 =ok(=ng =ok为标记) 这个计算结果不太对 代码里附件2的设定逻辑是后者优先
点赞 回复 分享
发布于 2023-03-21 09:22 日本

相关推荐

评论
73
30
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务