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
}
}

执行结果如下:


左神java代码

2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属的更多相关文章

  1. 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?

    这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...

  2. 一个for循环打印二维数组

    #include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...

  3. 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序

    从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...

  4. JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数

    JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...

  5. Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

    要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...

  6. LeetCode——Rotate Image(二维数组顺时针旋转90度)

      问题: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...

  7. python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  8. php数组根据某一个键值,把相同键值的合并生成一个新的二维数组

    http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...

  9. Python之二维数组N*N顺时针旋转90度

    需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...

  10. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

随机推荐

  1. 一篇文章带你快速入门学习RPA

    大纲: 什么是RPA? RPA的应用领域有哪些? RPA机器人技术一般用于什么行业? RPA的市场需求是什么? RPA项目的实施过程? RPA的未来趋势怎么样?   什么是RPA?   RPA 全称& ...

  2. dart基础---->dart语法入门

    Dart is an open source, structured programming language for creating complex, browser-based web appl ...

  3. 【深入浅出 Yarn 架构与实现】5-3 Yarn 调度器资源抢占模型

    本篇将对 Yarn 调度器中的资源抢占方式进行探究.分析当集群资源不足时,占用量资源少的队列,是如何从其他队列中抢夺资源的.我们将深入源码,一步步分析抢夺资源的具体逻辑. 一.简介 在资源调度器中,以 ...

  4. 原型继承和 Class 继承

    涉及面试题: 原型如何实现继承? Class 如何实现继承? Class 本质是什么? ⾸先先来讲下 class ,其实在 JS 中并不存在类, class 只是语法糖,本质还是函数. class P ...

  5. mongo操作数据库

    1.回顾 2.node + mongodb 2.1 安装mongodb 项目中既可以使用mongodb,但是推荐使用mongoose cnpm i mongoose@4 -S 2.2 连接数据库 一定 ...

  6. Ajax案例:点击按钮向服务端发送请求,将服务端返回的响应体结果在div中显示(get请求)

    客户端代码: <style> #div { width: 200px; height: 100px; border: 2px solid blue; } </style> &l ...

  7. selenuim文件的下载

    文件下载:谷歌浏览器则会自动实现下载,不会弹出框提示,会直接下载谷歌的默认路径:火狐浏览器下载会弹出提示框,此时火狐需要添加浏览器的配置参数信息: 火狐的相关浏览器配置参数可以通过about:conf ...

  8. Nordic nRF52系列/nRF5340硬件设计(一)选型及原理图设计

    Nordic 的BLE系列芯片从第一代的nRF51系列,到第二代的nRF52系列,发展到目前最新的第三代的nRF5340.目前市场中使用最多的nRF52系列一共有七款芯片,它们是:nRF52805.n ...

  9. 1.springsecurity基于内存和数据库的认证

    1.总结: 昨天主要是使用security实现了基于内存的认证和基于数据库的认证(实际项目中使用): 在security的项目中,必须配置WebSecurityConfigurerAdaptor的实现 ...

  10. 全网最详细中英文ChatGPT-GPT-4示例文档-智能多功能学习机从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...