题解 | #购物单#

购物单

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);
            }
        }
}
全部评论
题目都看不懂
1 回复 分享
发布于 2022-07-25 23:22
最后那些max是在干啥啊
1 回复 分享
发布于 2022-07-25 13:59
这样的还算是中等题,我麻了
3 回复 分享
发布于 2022-10-11 17:30 江苏
这个题解比Naruto的直白清爽一点,Naruto的题解创造商品类来存储数据属实把人绕进去了,还有各种意义不明的缩写。。。这个题解就是直接将价格、满意度、是否为附件标志写入数组,看上去都好理解一点
2 回复 分享
发布于 2022-10-15 17:59 英国
题目都没看懂是不是没救了
2 回复 分享
发布于 2022-06-17 11:05
很厉害的代码,初看几分钟大致思路理解了,就是当时觉得这代码有点贪心的意思在里面,所以觉得可能会存在最终结果陷入局部最优的情况。分析了大概1个小时,验证了结果是没问题的。我觉得理解上面代码最关键的就是dp[i][j]里i和j的含义。我个人的理解是,i代表可以购买前i种货物,j代表你有的总钱数。ij取最大,代表所有种类货物都考虑且钱为题目钱数时的结果。理顺逻辑的话,可以从第一个货物开始思考,因为递归的起点是只考虑第一种货物。
1 回复 分享
发布于 2023-03-20 21:20 湖北
dp数组还可以继续优化,例如,无需遍历m+1行,只遍历主件即可
点赞 回复 分享
发布于 2025-03-14 15:05 湖北
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 日本
这个题那几个连续的dp赋值就是优中选优的过程 很妙 如果对代码整体不知道为啥这么写的建议去B站看一下labuladong讲的背包问题就懂了
点赞 回复 分享
发布于 2023-01-07 10:37 湖北
简介明了
点赞 回复 分享
发布于 2022-10-19 11:17 北京
为什么要new int[m+1][3],哪个大佬现身教教小白
点赞 回复 分享
发布于 2022-09-01 21:39 广东
money /= 10; 以及下面的 a/=10 是什么意思呀
点赞 回复 分享
发布于 2022-08-10 11:00
感觉你的和前面的大佬不一样啊
点赞 回复 分享
发布于 2022-06-14 17:18
膜拜大佬
点赞 回复 分享
发布于 2022-06-09 09:31
这个很强
点赞 回复 分享
发布于 2022-04-22 16:29
妙啊
点赞 回复 分享
发布于 2022-04-08 11:48
输入: 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-03-02 15:47
妙啊
点赞 回复 分享
发布于 2022-01-23 17:53

相关推荐

一共一个小时,面试难度以及自己的回答算是最近的面试压力比较大的,实习问了30分钟,中间穿插八股。1.redis数据结构2.redis持久化机制3.mysql索引底层4.聚簇索引与非聚簇索引5.索引优化6.索引失效7.mysql执行一条sql8.那么多索引mysql怎么选(不会)9.tcp与udp区别10.tcp为什么可靠11.消息队列作用12.kafka怎么保证消息有序性13.mcp是什么?14.skills是什么?15.jvm内存分配与回收过程(我讲了从创建对象到判断垃圾对象到垃圾回收我全说了一遍,是这个吗?)16.fullgc触发机制17.tcp的拥塞控制流程(不会了)18.分布式事务解决方案,说了2pc,3pc,tcc。算法是反转双向链表,没有按格式输出,但是面试官没让继续写了,面完以为挂了,结果晚上秒过,看看复试什么情况吧。今天百度打电话准备发offer了,业务跟在手子的差不多,很垂,并且说不分日常暑期,只看表现,会有转正机会,但是考虑再三还是拒绝了,百度实习薪资确实有点低,title也不如之前了,但是面试的二位业务老师我很喜欢,对我的评价也不错,希望之后能有机会共事。从三月份到现在一共面了六家,面试次数总共是8场,情况如下:脉脉二面(无答复,默认挂)百度二面已oc美团一面过,下周一二面shein一面过直接HR面游族一面过直接HR面腾讯一面过等待约二面滴滴明天一面面试通过率还是蛮高的,但是大部分都是日常,感觉对我现在的加成不大,大概率不会去,不知道暑期会是什么情况呢唉,希望能有面试吧,继续加油。字节被无hc直接取消了,现在还没人捞,有没有字节HR救救我
不管什么都不想跳动了:本人美团百度快手都待过,建议肯定是直接留快手多一点产出后转正or直接冲字节腾讯暑期吧。一是快手从福利到基建都吊打另外两家。美团现在这个业务比较惨,本来毛利就很低,亏损严重,今年很可能要优化人力降低成本,去了别说日常,就算暑期后面都很可能被优化。百度其实实习生权限挺高的,可以接触到一些含金量高的项目,但是现在的风评不如之前了,薪资也不高。二是转正概率和薪资是跟产出挂钩的,你都在手子已经积累产出了,去其他家日常实习产出都是从0开始,肯定不可能有你在手子转正可能性大啊,现在日常压根没必要去,而且我有两个师弟都是在快手日常转正的,不用太担心,安心留在手子一边多做一点产出然后一边冲字节腾讯暑期,字节腾讯今年实习岗位非常多的,不如好好把握这个,加油。
查看18道真题和解析
点赞 评论 收藏
分享
评论
76
32
分享

创作者周榜

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