2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想
2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。
一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。
每组中的物品只能选择1件,现在他想知道最大的利用价值是多少?
答案2024-03-20:
来自左程云。
大体步骤如下:
1.定义常量 MAXN 和 MAXM,分别表示物品数量和背包容量的最大值。
2.声明一个二维数组 arr 用于存储物品的重量、价值和组别信息。
3.声明一个一维数组 dp 用于记录每个容量下的最大利用价值。
4.获取输入信息,包括背包容量 m 和物品数量 n。
5.遍历n次,将物品的重量、价值和组别信息存入二维数组 arr。
6.根据物品的组别信息对二维数组 arr 进行排序。
7.初始化数组 dp,将所有元素设置为0。
8.使用动态规划算法计算最大利用价值。遍历每个组别的物品,对于每个容量 r,遍历当前组别的物品,如果容量 r 大于等于物品的重量,则更新 dp[r] 为当前物品的价值加上 dp[r-物品重量] 的最大值。
9.返回 dp[m],即背包容量为 m 时的最大利用价值。
10.打印结果。
总的时间复杂度是 O(nmlog(n)),其中 n 是物品数量,m 是背包容量。这是因为需要对二维数组 arr 进行排序,排序的时间复杂度是 O(nlog(n)),而计算最大利用价值的动态规划算法的时间复杂度是 O(nm)。
总的额外空间复杂度是 O(n),其中 n 是物品数量。这是因为需要使用数组 dp 来记录每个容量下的最大利用价值。
go完整代码如下:
package main
import (
"fmt"
"sort"
)
const MAXN = 1001
const MAXM = 1001
var arr = [MAXN][3]int{}
var dp = [MAXM]int{}
var m, n int
func compute() int {
for start, end := 0, 1; start < n; {
for end < n && arr[end][2] == arr[start][2] {
end++
}
for r := m; r >= 0; r-- {
for i := start; i < end; i++ {
if r >= arr[i][0] {
dp[r] = max(dp[r], arr[i][1]+dp[r-arr[i][0]])
}
}
}
start = end
end++
}
return dp[m]
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
inputs := []int{45, 3,
10, 10, 1,
10, 5, 1,
50, 400, 2}
ii := 0
m = inputs[ii]
ii++
n = inputs[ii]
ii++
for i := 0; i < n; i++ {
arr[i][0] = inputs[ii]
ii++
arr[i][1] = inputs[ii]
ii++
arr[i][2] = inputs[ii]
ii++
}
sort.Slice(arr[:n], func(i, j int) bool {
return arr[i][2] < arr[j][2]
})
for i := 0; i <= m; i++ {
dp[i] = 0
}
fmt.Println(compute())
}

python完整代码如下:
# -*-coding:utf-8-*-
MAXN = 1001
MAXM = 1001
arr = [[0] * 3 for _ in range(MAXN)]
dp = [0] * MAXM
m, n = 0, 0
def compute():
start = 0
while start < n:
end = start + 1
while end < n and arr[end][2] == arr[start][2]:
end += 1
for r in range(m, -1, -1):
for i in range(start, end):
if r >= arr[i][0]:
dp[r] = max(dp[r], arr[i][1] + dp[r - arr[i][0]])
start = end
return dp[m]
def max(a, b):
return a if a > b else b
inputs = [45, 3,
10, 10, 1,
10, 5, 1,
50, 400, 2]
ii = 0
m = inputs[ii]
ii += 1
n = inputs[ii]
ii += 1
for i in range(n):
arr[i][0] = inputs[ii]
ii += 1
arr[i][1] = inputs[ii]
ii += 1
arr[i][2] = inputs[ii]
ii += 1
arr = arr[:n]
arr.sort(key=lambda x: x[2])
for i in range(m + 1):
dp[i] = 0
print(compute())

2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想的更多相关文章
- Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)
560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] ...
- Python Cookbook(第3版)中文版:15.20 处理C语言中的可迭代对象
15.20 处理C语言中的可迭代对象¶ 问题¶ 你想写C扩展代码处理来自任何可迭代对象如列表.元组.文件或生成器中的元素. 解决方案¶ 下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素: s ...
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...
- Java实现 LeetCode 698 划分为k个相等的子集(递归)
698. 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, ...
- 累加和为 K 的子数组问题
累加和为 K 的子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的子数组问题 CSDN:累加和为 K 的子数组问题 题目说明 数组全为正数,且每个数各不相同,求累加和为K的子数组组合有哪 ...
- 1077 互评成绩计算 (20 分)C语言
在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...
- noip2017爆炸记——题解&总结&反省(普及组+提高组)
相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...
- 35-Ubuntu-组管理-01-添加组/删除组/确认组信息
组管理 提示: 创建组/删除组的终端命令都需要sudo执行,标准用户没有权限! 序号 命令 作用 01 sudo groupadd 组名 添加组 02 sudo groupdel 组名 删除组 03 ...
- iOS之UITableView组头组尾视图/标题悬停
最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...
- 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数
题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...
随机推荐
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)
第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...
- 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件
壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...
- NC51032 八数码
题目链接 题目 题目描述 The 15-puzzle has been around for over 100 years; even if you don't know it by that nam ...
- Sigrok逻辑分析仪软件(基于CY7C68013A)
关于逻辑分析仪 逻辑分析仪在调试数字电路时是非常重要的工具. 其形式与示波器类似, 采集被检测信号的电平, 并绘制时序图进行分析. 逻辑分析仪和示波器的区别: 数字量和模拟量: 示波器采集的是模拟量, ...
- diffstat命令
diffstat命令 diffstat命令根据diff的比较结果,统计各文件的插入.删除.修改等差异计量. 语法 diffstat [options] [files] 参数 -c: 输出的每一行都以# ...
- Java中各种比较对象方式对比
1.介绍 比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性. 2.==和!=操作符 让我们从==和 ...
- 项目实战:Qt西门子PLC通讯调试和模拟工具(包含PLC上位机通讯,PLC服务器)
前言 西门西PLC.台达触摸屏.法兰克机床等等多年以前玩得比较多,改造机床.维修机床.给机床编程等等,没事还能车个零件啥的,对于多年以前的研发改造,有时间就重新整理下. 先上点有历史年代感的 ...
- 开源软件CVE_Search的配置与使用(详细)
目录 项目介绍 环境配置 初始化cve_search 使用cve_search 简介 CVE: https://baike.baidu.com/item/CVE/9483464?fr=aladdin ...
- Hello-FPGA CoaXPress 2.0 FPGA DEVICE IP Core Demo
Hello-FPGA CoaXPress 2.0 Device FPGA IP Core Demo 1 说明 本手册针对Helllo-FPGA的CoaXPress 2.0 DEVICE FPG ...
- 微信小程序:接手项目,修bug
好家伙, 问题描述如下: 小程序主界面,选择快速上传会议记录 选择快速 其中,没有2022-2023第二学期,所以,新的会议记录无法上传 于是,我自愿修复这个bug 由于我们没有产品文档 我只能由 ...