首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01

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

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OVnD6c1RxIXevzNf4CDYiUYA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com