2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。

一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。

每组中的物品只能选择1件,现在他想知道最大的利用价值是多少?

答案2024-03-20:

来自左程云

灵捷3.5

大体步骤如下:

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件,现在他想的更多相关文章

  1. Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)

    560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] ...

  2. Python Cookbook(第3版)中文版:15.20 处理C语言中的可迭代对象

    15.20 处理C语言中的可迭代对象¶ 问题¶ 你想写C扩展代码处理来自任何可迭代对象如列表.元组.文件或生成器中的元素. 解决方案¶ 下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素: s ...

  3. Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)

    713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...

  4. Java实现 LeetCode 698 划分为k个相等的子集(递归)

    698. 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, ...

  5. 累加和为 K 的子数组问题

    累加和为 K 的子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的子数组问题 CSDN:累加和为 K 的子数组问题 题目说明 数组全为正数,且每个数各不相同,求累加和为K的子数组组合有哪 ...

  6. 1077 互评成绩计算 (20 分)C语言

    在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...

  7. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  8. 35-Ubuntu-组管理-01-添加组/删除组/确认组信息

    组管理 提示: 创建组/删除组的终端命令都需要sudo执行,标准用户没有权限! 序号 命令 作用 01 sudo groupadd 组名 添加组 02 sudo groupdel 组名 删除组 03 ...

  9. iOS之UITableView组头组尾视图/标题悬停

    最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...

  10. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

随机推荐

  1. 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)

    第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...

  2. 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件

    壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...

  3. NC51032 八数码

    题目链接 题目 题目描述 The 15-puzzle has been around for over 100 years; even if you don't know it by that nam ...

  4. Sigrok逻辑分析仪软件(基于CY7C68013A)

    关于逻辑分析仪 逻辑分析仪在调试数字电路时是非常重要的工具. 其形式与示波器类似, 采集被检测信号的电平, 并绘制时序图进行分析. 逻辑分析仪和示波器的区别: 数字量和模拟量: 示波器采集的是模拟量, ...

  5. diffstat命令

    diffstat命令 diffstat命令根据diff的比较结果,统计各文件的插入.删除.修改等差异计量. 语法 diffstat [options] [files] 参数 -c: 输出的每一行都以# ...

  6. Java中各种比较对象方式对比

    1.介绍 比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性. 2.==和!=操作符 让我们从==和 ...

  7. 项目实战:Qt西门子PLC通讯调试和模拟工具(包含PLC上位机通讯,PLC服务器)

      前言   西门西PLC.台达触摸屏.法兰克机床等等多年以前玩得比较多,改造机床.维修机床.给机床编程等等,没事还能车个零件啥的,对于多年以前的研发改造,有时间就重新整理下.  先上点有历史年代感的 ...

  8. 开源软件CVE_Search的配置与使用(详细)

    目录 项目介绍 环境配置 初始化cve_search 使用cve_search 简介 CVE: https://baike.baidu.com/item/CVE/9483464?fr=aladdin ...

  9. 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 ...

  10. 微信小程序:接手项目,修bug

    好家伙,   问题描述如下: 小程序主界面,选择快速上传会议记录 选择快速 其中,没有2022-2023第二学期,所以,新的会议记录无法上传 于是,我自愿修复这个bug 由于我们没有产品文档 我只能由 ...