2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属
2022-04-18:things是一个N3的二维数组,商品有N件,商品编号从1~N,
比如things[3] = [300, 2, 6],
代表第3号商品:价格300,重要度2,它是6号商品的附属商品,
再比如things[6] = [500, 3, 0],
代表第6号商品:价格500,重要度3,它不是任何附属,它是主商品,
每件商品的收益是价格重要度,花费就是价格,
如果一个商品是附属品,那么只有它附属的主商品购买了,它才能被购买,
任何一个附属商品,只会有1个主商品,
任何一个主商品的附属商品数量,不会超过2件,
主商品和附属商品的层级最多有2层。
给定二维数组things、钱数money,返回整体花费不超过money的情况下,最大的收益总和。
答案2022-04-18:
本来想用rust写的,但老是编译不通过,实在没辙。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
money := 1000
size := 5
things := [][][]int{{{800, 2, 0}}, {{400, 5, 1}}, {{300, 5, 1}}, {{400, 3, 0}}, {{500, 2, 0}}}
n := clean(things, size)
fmt.Println(n)
ans := maxScore(things, n, money)
fmt.Println(ans)
}
func clean(things [][][]int, size int) int {
for i := 0; i < size; i++ {
cur := things[i][0]
if cur[2] != 0 {
things[i] = make([][]int, 0)
things[cur[2]] = append(things[cur[2]], cur)
}
}
n := 0
for i := 0; i < size; i++ {
if len(things[i]) > 0 {
things[n] = things[i]
n++
}
}
return n
}
func maxScore(things [][][]int, n, money int) int {
dp := make([][]int, n)
for i := 0; i < n; i++ {
dp[i] = make([]int, money+1)
}
for i := 0; i < n; i++ {
for j := 0; j <= money; j++ {
dp[i][j] = -2
}
}
return process(things, n, 0, money, dp)
}
func process(things [][][]int, n, index, rest int, dp [][]int) int {
if rest < 0 {
return -1
}
if index == n {
return 0
}
if dp[index][rest] != -2 {
return dp[index][rest]
}
project := things[index]
a := project[0]
var b []int
if len(project) > 1 {
b = project[1]
}
var c []int
if len(project) > 2 {
c = project[2]
}
p1 := process(things, n, index+1, rest, dp)
p2 := process(things, n, index+1, rest-a[0], dp)
if p2 != -1 {
p2 += a[0] * a[1]
}
p3 := -1
if b != nil {
p3 = process(things, n, index+1, rest-a[0]-b[0], dp)
}
if p3 != -1 {
p3 += a[0]*a[1] + b[0]*b[1]
}
p4 := -1
if c != nil {
p4 = process(things, n, index+1, rest-a[0]-c[0], dp)
}
if p4 != -1 {
p4 += a[0]*a[1] + c[0]*c[1]
}
p5 := -1
if c != nil {
p5 = process(things, n, index+1, rest-a[0]-b[0]-c[0], dp)
}
if p5 != -1 {
p5 += a[0]*a[1] + b[0]*b[1] + c[0]*c[1]
}
ans := getMax(getMax(getMax(p1, p2), getMax(p3, p4)), p5)
dp[index][rest] = ans
return ans
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属的更多相关文章
- 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?
这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...
- 一个for循环打印二维数组
#include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...
- 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序
从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...
- JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...
- Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...
- LeetCode——Rotate Image(二维数组顺时针旋转90度)
问题: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- php数组根据某一个键值,把相同键值的合并生成一个新的二维数组
http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...
- Python之二维数组N*N顺时针旋转90度
需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
随机推荐
- 关于windows cmd 控制台输出中文
由于中文在window 输出总是优乱码可能性 ,先建cmd.reg 负责下面内容 ,双击运行即可. Windows Registry Editor Version 5.00 [HKEY_CURR ...
- Leftpad事件 我们是不是早已忘记该如何好好地编程?
多年前的Leftpad 撤包事件使得React . Babel 和许多流行的npm模块都受到波及,无法正常运行. 这些受到影响的模块都引入了一个叫做 left-pad 的模块. 以下就是这十一行代码: ...
- Python练习--简单练习(一看就能写出来的代码)
两数之和 数字的阶乘 求圆的面积 (输入半径,求解圆的面积) 求区间内所有素数的和 求前N个数字的平方和
- JavaWeb学习笔记第三弹
一.数据库设计 1.软件研发步骤 2.数据库设计概念 建立数据库中的表结构以及表与表之间的关联关系的过程 3.数据库设计的步骤 表关系:一对一.一对多(多对一).多对多 表关系之一对多 表关系之多对多 ...
- MySQL Mock大量数据做查询响应测试
上个迭代版本发布后,生产环境业务同事反馈仓配订单查询的页面加载时间过长. 因为页面原来是有的,这次开发是在原来基础上改的,因此没有额外做性能.测试环境只调用接口请求了少量数据去验证功能.在对比该迭代添 ...
- day06-静态资源访问&Rest风格
SpringBoot之静态资源访问&REST风格请求 1.SpringBoot静态资源访问 1.1基本介绍 只要静态资源是放在类路径下的:/static./public./resources. ...
- ArchLinux 作业系统安装教程
如果你能看到此文,想必你一定玩过不少的发行商发行的 Linux 作业系统或者听说过很多发行商发行的 Linux 作业系统.如果你玩过不少的 Linux 作业系统,对于安装系统可谓是轻车熟路,就是闭着眼 ...
- smart rtmpd 服务器配置文件说明及优化方法介绍
---------------------------------------------------------------------------------------------------- ...
- 4种API性能恶化根因分析
摘要:服务发生性能恶化时,需要投入大量人力分析性能异常根因,分析成本高,耗时长.我们提出了一种先在异常调用链内部分析候选根因,再在全局拓扑环境下对候选根因进行汇聚的二级分析方法,克服了调用链之间异常相 ...
- 详解DDD:如何避免写流水账代码?
在日常工作中我观察到,面对老系统重构和迁移场景,有大量代码属于流水账代码,通常能看到开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用性比较差 ...