描述

王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件 附件
电脑 打印机,扫描仪
书柜 图书
书桌 台灯,文具
工作椅

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第 j 件物品的价格为 v[j] ,重要度为 w[j] ,共选中了 k 件物品,编号依次为 j 1 , j 2 ,……, j k ,则所求的总和为:

v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。(其中 * 为乘号)

请你帮助王强设计一个满足要求的购物单。

输入描述:

输入的第 1 行,为两个正整数,用一个空格隔开:N m

(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)

从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q

(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)

输出描述:

输出文件只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )

示例1

输入:

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

输出:

2200

思路:总体还是采用动态规划的思想,不过这题有一个部分物品是附件,买附件必须买主件的约束条件,这样我们可以只算买主件的动态规划,把附件挂到主件下面,这样买主件从原来的买,不买2种情况变成买0附件,买1附件A,买1附件B,买2附件,不买5种情况,我们计算的时候计算5种情况然后然后然后按动态规划的思想往下拆分就可以了

这里因为告诉我们每个商品的价格都是10的整数倍,这样我们在动态规划的迭代次数是商品个数m乘以钱数N的,所以我们可以把N/10,商品价格也除以10,这样我们迭代次数只有m*N/10次,只有原来的的1/10次迭代,大大提升了迭代效率

解决代码:

import java.util.*;public class Main{public static void  main(String args[]){Scanner sc = new Scanner(System.in);int N = sc.nextInt();int m = sc.nextInt();int[] v= new int[m];int[] p= new int[m];int[] q= new int[m];int[]hq1= new int[m+1];// 存放主件的附件下标int[]hq2= new int[m+1];for(int i=0;i<=m;i++){hq1[i] = -1;hq2[i] = -1;}int[][]dp = new int[m+1][N/10+1];// 除以10减少动态规划迭代次数for(int i = 0;i<m;i++){v[i] = sc.nextInt()/10;p[i] = sc.nextInt();q[i] = sc.nextInt();if(q[i] !=0){if(hq1[q[i]]==-1){hq1[q[i]] =i;}else{hq2[q[i]] =i;}}}for(int i = 1;i <= m;i++){int tv=-1,tv1=-1,tv2=-1,tv3=-1,tdp=0,tdp1=0,tdp2=0,tdp3=0;tv=v[i-1];tdp=tv*p[i-1];if(hq1[i] != -1){tv1=tv+v[hq1[i]];tdp1 = tdp + v[hq1[i]]*p[hq1[i]];}if(hq2[i] != -1){tv2=tv+v[hq2[i]];tdp2 = tdp + v[hq2[i]]*p[hq2[i]];}if(hq1[i] != -1 && hq2[i] != -1){tv3=tv+v[hq1[i]]+v[hq2[i]];tdp3 = tdp + v[hq1[i]]*p[hq1[i]]+ v[hq2[i]]*p[hq2[i]];}for(int j=1;j<=N/10;j++){if(q[i-1] != 0){dp[i][j] = dp[i-1][j];}else{dp[i][j] = dp[i-1][j];if(j>=tv && tv!=-1){dp[i][j] = Math.max(dp[i][j],dp[i-1][j-tv]+tdp);}if(j>=tv1 && tv1!=-1){dp[i][j] = Math.max(dp[i][j],dp[i-1][j-tv1]+tdp1);}if(j>=tv2 && tv2!=-1){dp[i][j] = Math.max(dp[i][j],dp[i-1][j-tv2]+tdp2);}if(j>=tv3 && tv3!=-1){dp[i][j] = Math.max(dp[i][j],dp[i-1][j-tv3]+tdp3);}}}}System.out.println(dp[m][N/10]*10);}
}

牛客网-华为机试练习题 16 购物单相关推荐

  1. 【牛客网华为机试】HJ16 购物单

    题目 描述 王强今天很开心,公司发给N元的年终奖.王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 ...

  2. 牛客网–华为机试在线训练5:进制转换

    牛客网–华为机试在线训练5:进制转换 题目描述 写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串.(多组同时输入 ) 输入描述: 输入一个十六进制的数值字符串. 输出描述: 输出该 ...

  3. 牛客网华为机试题(JavaScript)

    最近在牛客网刷华为机试题,遇到了很多坑,记录: 每一道题目都经过自己实践验证 华为机试题 牛客网在javascript V8引擎下处理输入输出如下: 利用了readline()接收输入的每一行,多行处 ...

  4. 华为机试python编程题_牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  5. 「解析」牛客网-华为机考企业真题 1-20

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  6. 「解析」牛客网-华为机考企业真题 21-40

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  7. 牛客网华为机试(python)

    前言 牛客网华为机试(https://www.nowcoder.com/exam/oj/ta?tpId=37) 按难度分为入门,简单,中等,困难,较难五个等级 目录标题 前言 一,入门 二,简单 一, ...

  8. JavsScript牛客网华为机试(11-20)题解

    牛客网华为机试题解JavaScript版本 华为机试第11-20题解答(js) 11.数字颠倒 12.字符串反转 13.句子逆序 14.字符串排序 15.求int型数据在内存中存储时1的个数 16.购 ...

  9. 牛客网--华为机试在线训练10:字符个数统计

    牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...

最新文章

  1. SAP WM LP10 创建TO单据的时候,系统根据目的地Storage Type 100下的库存自动扣减TO里的数量
  2. 一个不错的安全站点yehg.net
  3. python经典程序练习题-99道经典练习题助你全面掌握python基础知识,附技巧答案...
  4. 修改SSO管理员密码
  5. Android学习----发行版本
  6. (企业案例)使用Nacos持久化规则,改造sentinel-dashboard
  7. JAVA类定义,成员类,抽象类及接口类
  8. 在unity向量空间内绘制几何(4): 利用平面几何知识画像素直线
  9. QT程序在windows下部署发布
  10. 那些精贵的3D视觉系统学习资源总结(附书籍、网址与视频教程)
  11. linux 使cpu使用率升高_linux性能优化
  12. 统计项目代码行数工具,如何统计代码行数。
  13. QueryDSL学习记录(持续更新)
  14. 图灵聊天机器人小程序
  15. 74CMS_v4.2.1-v4.2.129后台Getshell
  16. html5鲜花网页代码,JS制作漂亮的鲜花完整代码
  17. PS——规定尺寸的证件照的制作
  18. UWB技术的工作原理
  19. android sqlite 示例,Android SQLite数据库操作示例
  20. 英语口语232之每日十句口语

热门文章

  1. Github/gitee 上传文件最大100MB限制this exceeds file size limit of 100.0 MB
  2. JQuery 操作弹出层 iframe页面元素的方式
  3. 这三种屏幕OLED、AMOLED、LCD的优缺点有哪些呢?
  4. Android 源码在线阅读
  5. mysql 利用information_schema库COLUMNS表查看哪些表含有指定字段
  6. WiFi_WiFi6和WiFi5区别
  7. 猫游记服务器维护后露娜,猫游记官方网站
  8. 写Android的快两年了,终于碰到视频相关(视频压缩)的技术
  9. k8s探针检测php,k8s实践11:kubernetes监测探针简单测试
  10. 什么是搜索词?有什么用?