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 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
随机推荐
- webservice学习随笔(二):通过cxf实现webservice
一:基本概念(可跳过) Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基 ...
- 使用react-vite-antd,修改antd主题,报错 [vite] Internal server error: Inline JavaScript is not enabled. Is it set in your options? It is hacky way to make this function will be compiled preferentially by less
一般报错 在官方文档中,没有关于vite中如何使用自定义主题的相关配置,经过查阅 1.安装less yarn add less (已经安装了就不必再安装) 2.首先将App.css改成App.les ...
- classload加载机制
BootstrapClassLoader.ExtClassLoader.AppClassLoader实际是查阅相应的环境属性sun.boot.class.path.java.ext.dirs和java ...
- Android笔记--Jetpack Room
Jetpack Room 使用Room简化数据库操作:(基于SQLite) 在使用Room之前: 使用Room框架有以下几个步骤: 1.实体类加@Entity注解 @PrimaryKey(autoGe ...
- Python学习笔记--异常+模块+包
异常的捕获 基本语法: 示例: 捕获指定异常 基本语法:--必写 示例: 捕获多个异常 示例: 捕获所有异常 示例: 异常else--可写可不写 示例: 异常finally(无论是否出现异常,都会去执 ...
- 数据库中1NF,2NF,3NF的判别
参照:https://blog.csdn.net/qq_28888837/article/details/98733448 1NF:每一个都是最原子化. 2NF:找到主键后,每一个非主键对主键都是完 ...
- 微软wsl2启用天父行程systemd
默认情况下 微软wsl2的天父行程是init,没办法使用systemctl相关指令,所以想使用天父行程 systemd. 本文以Wsl2 Alma Linux为例,启用systemd 上帝与你同在,阿 ...
- vue3 ts 类式写法的mixins
vue-property-decorator 混入(mixins) // mixins.ts import { Vue } from 'vue-property-decorator' class Mi ...
- SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具)
SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具) 搜到大部分打包exe的文章都是使用exe4j打包 步骤贼多,安装麻烦,打包麻烦 收费软件,公司使用会吃律师函 JDK14以上 ...
- Java 8 中需要知道的4个函数式接口-Function、Consumer、Supplier、Predicate
前言 Java 8 中提供了许多函数式接口,包括Function.Consumer.Supplier.Predicate 等等.这 4 个接口就是本篇将要分享的内容,它们都位于 java.util.f ...