首页 > 其他分享 >2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想

2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想

时间:2024-03-20 10:37:59浏览次数:24  
标签:inputs arr 背包 end ii 01 物品 dp

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())

在这里插入图片描述

标签:inputs,arr,背包,end,ii,01,物品,dp
From: https://www.cnblogs.com/moonfdd/p/18084674

相关文章

  • 代码随想录算法训练营第十五天| 226. 翻转二叉树 101. 对称二叉树
    226.翻转二叉树https://leetcode.cn/problems/invert-binary-tree/description/publicTreeNodeinvertTree(TreeNoderoot){invert(root);returnroot;}publicvoidinvert(TreeNodenode){if(node==null)return;TreeNod......
  • 350_{"code":401,"msg":"认证失败,无法访问系统资源","data":null}
    若依框架部署Linux访问报错,401认证失败,无法访问系统资源_认证失败,无法访问系统资源_冰糖码奇朵的博客-CSDN博客报错信息链接访问nginx配置解决......
  • S2-066漏洞分析与复现(CVE-2023-50164)
    Foreword自struts2官方纰漏S2-066漏洞已经有一段时间,期间断断续续地写,直到最近才完成。羞愧地回顾一下官方通告:2023.12.9发布,编号CVE-2023-50164,主要影响版本是2.5.0-2.5.32以及6.0.0-6.3.0,描述中提到了文件上传漏洞和目录穿越漏洞。开始以为这是个组合漏洞,其实不是,这是一个......
  • 亮灯指引,物品无忧-仓库货架亮灯寻物系统助您管理仓库事半功倍
    仓库货架亮灯寻物系统是一种智能化的仓库管理工具,通过给货架安装感应器和LED灯,实现物品无忧的管理。该系统的工作原理是,在货架上放置感应器,当有物品放置在货架上时,感应器会自动检测到并发送信号给控制系统。控制系统会根据物品的信息,控制LED灯亮起,指引操作人员找到需要的物品......
  • 持续集成平台 01 jenkins 入门介绍
    拓展阅读Devops-01-devops是什么?Devops-02-Jpom简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件代码质量管理SonarQube-01-入门介绍项目管理平台-01-jira入门介绍缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件项目管理平台-01-Phab......
  • 蓝桥杯 2013 国 AC 网络寻路 第四届国赛 洛谷P8605
    [蓝桥杯2013国AC]网络寻路题目描述XXX国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。源地址和目标地......
  • 背包数据集5520张VOC+YOLO张
    背包在生活中是不可或缺的存在。无论是上学、上班,还是旅行、户外探险,背包都能为我们提供极大的便利。它有着足够的容量,可以装载书本、文件、电子设备以及个人物品,使我们随时随地都能轻松携带所需物品。背包的多样设计也适应了不同场合的需求,如休闲风格的背包适合日常出行,而专业......
  • 系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容
    原文链接:系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容Hello,大家好啊!今天,我非常高兴地为大家开启一个新的系列文章——在统信UOS上扩容系统盘。随着我们对电脑的日常使用,系统盘的空间往往会逐渐变得不够用,特别是在安装了大量软件或数据积累后。为了改善这一状况,扩......
  • 01 | Swoole与Go系列教程之HTTP服务的应用
    首发原文链接:Swoole与Go系列教程之HTTP服务的应用大家好,我是码农先森。写在前面PHP曾是Web开发领域佼佼者,随着业务壮大,异步和高并发方面不足显现。Swoole曾经尝试填补空白,但局限性也比较的明显。Go语言的崛起,简洁语法和并发优势吸引大厂使用,吸引了大多数程序员的转......
  • P3714 [BJOI2017] 树的难题
    fromxcs题意:给定一棵\(n\)个节点的树,树根为\(1\),每个点有一个编号,每条边有一个边权。定义\(dep(x)\)表示一个点到根简单路径上边权的和,\(lca(x,y)\)表示\(x,y\)节点在树上的最近公共祖先。共\(m\)组询问,每次询问给出\(l,r\),求对于所有点编号的二元组\((i,j)\)......