首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:

2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:

原创
作者头像
福大大架构师每日一题
发布于 2022-04-18 12:56:23
发布于 2022-04-18 12:56:23
3000
举报

2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N,

比如things3 = 300, 2, 6,

代表第3号商品:价格300,重要度2,它是6号商品的附属商品,

再比如things6 = 500, 3, 0,

代表第6号商品:价格500,重要度3,它不是任何附属,它是主商品,

每件商品的收益是价格*重要度,花费就是价格,

如果一个商品是附属品,那么只有它附属的主商品购买了,它才能被购买,

任何一个附属商品,只会有1个主商品,

任何一个主商品的附属商品数量,不会超过2件,

主商品和附属商品的层级最多有2层。

给定二维数组things、钱数money,返回整体花费不超过money的情况下,最大的收益总和。

答案2022-04-18:

本来想用rust写的,但老是编译不通过,实在没辙。

代码用golang编写。代码如下:

代码语言:go
AI代码解释
复制
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代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6]
2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N,
福大大架构师每日一题
2022/06/04
3060
2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6]
2022-01-01:给定int[][] meetings,比如 { {66, 70} 0号会议
一开始的时间是0,任何会议都持续10的时间,但是一个会议一定要在该会议截止时间之前开始,
福大大架构师每日一题
2022/01/01
1180
2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩子不能选相邻的格子
2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连,
福大大架构师每日一题
2023/11/26
2080
2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩子不能选相邻的格子
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调度方案中能使所有司机总收入最高的方案,是多少钱?
福大大架构师每日一题
2021/06/22
2270
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3210
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-11-20:一场电影开始和结束时间可以用一个小数组来表
2021-11-20:一场电影开始和结束时间可以用一个小数组来表示"07:30","12:00",已知有2000场电影开始和结束都在同一天,这一天从00:00开始到23:59结束,一定要选3场完全不冲突的电影来观看,返回最大的观影时间。如果无法选出3场完全不冲突的电影来观看,返回-1。来自小红书。
福大大架构师每日一题
2021/11/20
4630
2021-10-28:打家劫舍 II。你是一个专业的小偷,计划偷窃
2021-10-28:打家劫舍 II。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额 。力扣213。
福大大架构师每日一题
2021/10/28
3090
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 ring 拼出 key 字符 keyi 的阶段中:您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 keyi 。如果字符 keyi 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。
福大大架构师每日一题
2021/08/08
3740
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自
2022-04-14:小美有一个长度为n的数组,为了使得这个数组的和尽量大,她向会魔法的小团进行求助。
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_01_2_week/Code05_MagicTowSubarrayMakeMaxSum.java)
福大大架构师每日一题
2022/06/04
5280
2022-04-14:小美有一个长度为n的数组,为了使得这个数组的和尽量大,她向会魔法的小团进行求助。
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。 获得分数为 L_X_R。 2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L_X。 3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X_R。 4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3_2;再打爆2,获得2_5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3_2;再打爆5,获得2_5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3_2_5;再打爆3,获得3_5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3_2_5;再打爆5,获得3_5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2_5;再打爆3,获得3_2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2_5;再打爆2,获得3_2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/05/04
3420
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。
福大大架构师每日一题
2021/05/06
5810
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值mapi == 0 表示(i,j)位置是空座mapi == 1 表示(i,j)位置坐了人根据防疫要求,任何人的上、下、左、右,四个相邻的方向都不能再坐人但是为了餐厅利用的最大化,也许还能在不违反防疫要求的情况下,继续安排人吃饭请返回还能安排的最大人数如果一开始的状况已经不合法,直接返回-1比如:1 0 0 00 0 0 1不违反防疫要求的情况下,这个餐厅最多还能安排2人,如下所示,X是新安排的人1 0 X 00 X 0 1再比如
福大大架构师每日一题
2023/01/14
5400
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2021-10-18:乘积最大子数组。给你一个整数数组 nums
2021-10-18:乘积最大子数组。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。力扣152。
福大大架构师每日一题
2021/10/18
2720
golang刷leetcode 技巧(38)丑数
我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
golangLeetcode
2022/08/02
2030
2022-03-05:不相交的线。 在两条独立的水平线上按给定的顺
现在,可以绘制一些连接两个数字 nums1i 和 nums2j 的直线,这些直线需要同时满足满足:
福大大架构师每日一题
2022/03/05
3670
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
2023-03-11:给定一个N*M的二维矩阵,只由字符'O'、'X'、'S'、'E'组成,
福大大架构师每日一题
2023/03/11
8470
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。
福大大架构师每日一题
2021/04/04
9420
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改投1号店的报
3.调用process函数,传入arr数组、当前位置i、店铺数量n和change数组。
福大大架构师每日一题
2023/12/28
2040
2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改投1号店的报
2021-04-05:给两个长度分别为M和N的整型数组...
2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。
福大大架构师每日一题
2021/04/05
4930
2021-04-05:给两个长度分别为M和N的整型数组...
2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用
2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则:
福大大架构师每日一题
2021/12/08
2650
推荐阅读
2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6]
3060
2022-01-01:给定int[][] meetings,比如 { {66, 70} 0号会议
1180
2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩子不能选相邻的格子
2080
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域
2270
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3210
2021-11-20:一场电影开始和结束时间可以用一个小数组来表
4630
2021-10-28:打家劫舍 II。你是一个专业的小偷,计划偷窃
3090
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自
3740
2022-04-14:小美有一个长度为n的数组,为了使得这个数组的和尽量大,她向会魔法的小团进行求助。
5280
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3420
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
5810
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
5400
2021-10-18:乘积最大子数组。给你一个整数数组 nums
2720
golang刷leetcode 技巧(38)丑数
2030
2022-03-05:不相交的线。 在两条独立的水平线上按给定的顺
3670
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
8470
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
9420
2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改投1号店的报
2040
2021-04-05:给两个长度分别为M和N的整型数组...
4930
2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用
2650
相关推荐
2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档