网易首页 > 网易号 > 正文 申请入驻

2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数

0
分享至

2024-03-27:用go语言,多维费用背包。

给你一个二进制字符串数组 strs 和两个整数 m 和 n,

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集。

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。

输出:4。

答案2024-03-27:

来自左程云。

灵捷3.5

大体步骤如下:

1.函数使用递归的方式实现。它遍历字符串数组,将每个字符串中0和1的数量存储在一个二维数组中。然后通过递归函数进行计算,不断比较所选字符串是否符合要求,选择放入或不放入子集。该方法的时间复杂度为O(2^n),空间复杂度为O(n)。

findMaxForm1

strs

arr

process1

2.函数使用记忆化搜索的方式实现。它也遍历字符串数组得到二维数组,但使用三维数组进行记忆化,记录已经计算过的结果,避免重复计算。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

findMaxForm2

strs

arr

dp

3.函数使用动态规划的方式实现。它从后向前遍历字符串数组,得到二维数组来保存计算结果。通过比较选择当前字符串加入子集还是不加入子集,并更新动态规划数组。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

findMaxForm3

strs

dp

dp

4函数使用动态规划的方式实现。它遍历字符串数组,得到二维数组来保存计算结果。使用一维数组进行滚动更新,从后向前遍历,根据当前字符串的0和1的数量,更新动态规划数组。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n)。

findMaxForm4

strs

dp

dp

dp

总时间复杂度:O(m * n * len(strs))

总额外空间复杂度:O(m * n * len(strs))

Go完整代码如下:

packagemain
import(
"fmt"
)
varzeros,onesint
funcfindMaxForm1(strs[]string,mint,nint)int{
len:=len(strs)
arr:=make([][]int,len)
fori:=0;izeroAndOne(strs[i])
arr[i]=[]int{zeros,ones}
}
returnprocess1(arr,0,m,n)
}
funcprocess1(arr[][]int,iint,zint,oint)int{
ifi==len(arr){
return0
}
p1:=process1(arr,i+1,z,o)
p2:=0
ifarr[i][0]<=z&&arr[i][1]<=o{
p2=1+process1(arr,i+1,z-arr[i][0],o-arr[i][1])
}
ifp1>p2{
returnp1
}
returnp2
}
funcfindMaxForm2(strs[]string,mint,nint)int{
len:=len(strs)
arr:=make([][]int,len)
fori:=0;izeroAndOne(strs[i])
arr[i]=[]int{zeros,ones}
}
dp:=make([][][]int,len)
fori:=0;idp[i]=make([][]int,m+1)
forj:=0;j<=m;j++{
dp[i][j]=make([]int,n+1)
fork:=0;k<=n;k++{
dp[i][j][k]=-1
}
}
}
returnprocess2(arr,0,m,n,dp)
}
funcprocess2(arr[][]int,iint,zint,oint,dp[][][]int)int{
ifi==len(arr){
return0
}
ifdp[i][z][o]!=-1{
returndp[i][z][o]
}
p1:=process2(arr,i+1,z,o,dp)
p2:=0
ifarr[i][0]<=z&&arr[i][1]<=o{
p2=1+process2(arr,i+1,z-arr[i][0],o-arr[i][1],dp)
}
ans:=p1
ifp2>p1{
ans=p2
}
dp[i][z][o]=ans
returnans
}
funcfindMaxForm3(strs[]string,mint,nint)int{
len0:=len(strs)
dp:=make([][][]int,len0+1)
fori:=len0;i>=0;i--{
dp[i]=make([][]int,m+1)
forz:=0;z<=m;z++{
dp[i][z]=make([]int,n+1)
}
}
fori:=len0-1;i>=0;i--{
zeroAndOne(strs[i])
forz:=0;z<=m;z++{
foro:=0;o<=n;o++{
dp[i][z][o]=dp[i+1][z][o]
ifzeros<=z&&ones<=o{
dp[i][z][o]=max(dp[i][z][o],1+dp[i+1][z-zeros][o-ones])
}
}
}
}
returndp[0][m][n]
}
funczeroAndOne(strstring){
zeros=0
ones=0
fori:=0;iifstr[i]=='0'{
zeros++
}else{
ones++
}
}
}
funcfindMaxForm4(strs[]string,mint,nint)int{
dp:=make([][]int,m+1)
fori:=0;i<=m;i++{
dp[i]=make([]int,n+1)
}
for_,s:=rangestrs{
zeroAndOne(s)
fori:=m;i>=zeros;i--{
forj:=n;j>=ones;j--{
dp[i][j]=max(dp[i][j],dp[i-zeros][j-ones]+1)
}
}
}
returndp[m][n]
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
strs:=[]string{"10","0001","111001","1","0"}
m:=5
n:=3
res1:=findMaxForm1(strs,m,n)
fmt.Println("findMaxForm1:",res1)
res2:=findMaxForm2(strs,m,n)
fmt.Println("findMaxForm2:",res2)
res3:=findMaxForm3(strs,m,n)
fmt.Println("findMaxForm3:",res3)
res4:=findMaxForm4(strs,m,n)
fmt.Println("findMaxForm4:",res4)
}



Python完整代码如下:

#-*-coding:utf-8-*-
defzero_and_one(string):
zeros=0
ones=0
forcharinstring:
ifchar=='0':
zeros+=1
else:
ones+=1
returnzeros,ones
deffind_max_form1(strs,m,n):
length=len(strs)
arr=[]
foriinrange(length):
zeros,ones=zero_and_one(strs[i])
arr.append((zeros,ones))
returnprocess1(arr,0,m,n)
defprocess1(arr,i,z,o):
ifi==len(arr):
return0
p1=process1(arr,i+1,z,o)
p2=0
ifarr[i][0]<=zandarr[i][1]<=o:
p2=1+process1(arr,i+1,z-arr[i][0],o-arr[i][1])
ifp1>p2:
returnp1
returnp2
deffind_max_form2(strs,m,n):
length=len(strs)
arr=[]
foriinrange(length):
zeros,ones=zero_and_one(strs[i])
arr.append((zeros,ones))
dp=[[[-1]*(n+1)for_inrange(m+1)]for_inrange(length)]
returnprocess2(arr,0,m,n,dp)
defprocess2(arr,i,z,o,dp):
ifi==len(arr):
return0
ifdp[i][z][o]!=-1:
returndp[i][z][o]
p1=process2(arr,i+1,z,o,dp)
p2=0
ifarr[i][0]<=zandarr[i][1]<=o:
p2=1+process2(arr,i+1,z-arr[i][0],o-arr[i][1],dp)
ans=p1
ifp2>p1:
ans=p2
dp[i][z][o]=ans
returnans
deffind_max_form3(strs,m,n):
length=len(strs)
dp=[[[0]*(n+1)for_inrange(m+1)]for_inrange(length+1)]
foriinrange(length-1,-1,-1):
zeros,ones=zero_and_one(strs[i])
forzinrange(m+1):
foroinrange(n+1):
dp[i][z][o]=dp[i+1][z][o]
ifzeros<=zandones<=o:
dp[i][z][o]=max(dp[i][z][o],1+dp[i+1][z-zeros][o-ones])
returndp[0][m][n]
deffind_max_form4(strs,m,n):
dp=[[0]*(n+1)for_inrange(m+1)]
forsinstrs:
zeros,ones=zero_and_one(s)
foriinrange(m,zeros-1,-1):
forjinrange(n,ones-1,-1):
dp[i][j]=max(dp[i][j],dp[i-zeros][j-ones]+1)
returndp[m][n]
strs=["10","0001","111001","1","0"]
m=5
n=3
res1=find_max_form1(strs,m,n)
print("findMaxForm1:",res1)
res2=find_max_form2(strs,m,n)
print("findMaxForm2:",res2)
res3=find_max_form3(strs,m,n)
print("findMaxForm3:",res3)
res4=find_max_form4(strs,m,n)
print("findMaxForm4:",res4)



声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
全球第100个市场开通!马斯克旗下“星链”在津巴布韦启动运营,用户规模已突破300万【附卫星互联网行业现状分析】

全球第100个市场开通!马斯克旗下“星链”在津巴布韦启动运营,用户规模已突破300万【附卫星互联网行业现状分析】

前瞻网
2024-05-27 18:32:43
Scotto:联盟仍有人认为老鹰会拆双枪 多位高管看重穆雷而非吹杨

Scotto:联盟仍有人认为老鹰会拆双枪 多位高管看重穆雷而非吹杨

直播吧
2024-05-29 16:15:07
5月29日,陈晓,太让人意外了!

5月29日,陈晓,太让人意外了!

我是晚伯伯
2024-05-29 10:31:28
这谁顶得住嘛!刘涛这身材,这才是尤物啊!

这谁顶得住嘛!刘涛这身材,这才是尤物啊!

冷却爱情
2024-05-11 09:09:15
中美“芯”战升级!美国剑指RISC-V指令集,蔡正元:中国人有远见

中美“芯”战升级!美国剑指RISC-V指令集,蔡正元:中国人有远见

田间农人阿馋
2024-05-28 21:58:58
大家都和对象熟悉到什么程度了?评论区给我看的生理不适了

大家都和对象熟悉到什么程度了?评论区给我看的生理不适了

阿康四岁啦
2024-05-29 16:04:42
《庆余年2》范闲林婉儿大婚,林婉儿的头冠是3D打印,难怪像糖画

《庆余年2》范闲林婉儿大婚,林婉儿的头冠是3D打印,难怪像糖画

娱乐寡姐
2024-05-28 22:12:11
张本智和考上早稻田大学,张本美和升入高中,父亲张本宇满脸骄傲

张本智和考上早稻田大学,张本美和升入高中,父亲张本宇满脸骄傲

开心体育站
2024-05-29 16:56:50
越南北江一家卖淫咖啡店遭突袭,当场逮住一名正在嫖娼的外国人

越南北江一家卖淫咖啡店遭突袭,当场逮住一名正在嫖娼的外国人

越南语学习平台
2024-05-29 12:32:22
张康阳心有不甘!删除国米老板职位,换霸气语录:来过,征服过

张康阳心有不甘!删除国米老板职位,换霸气语录:来过,征服过

梦与体育
2024-05-29 16:53:53
突然宣布!一线城市沸腾,这次房价稳涨了?

突然宣布!一线城市沸腾,这次房价稳涨了?

山丘楼评
2024-05-29 11:25:16
发生关系,多久一次最舒服?

发生关系,多久一次最舒服?

匡北北
2023-12-15 23:56:59
万万没想到,广东楼市回到解放前 广州 广州市民纷纷佛山

万万没想到,广东楼市回到解放前 广州 广州市民纷纷佛山

李李李秋颜
2024-05-28 14:18:54
邢善萍任陕西省委副书记

邢善萍任陕西省委副书记

界面新闻
2024-05-28 18:51:02
男子新房的房顶被邻居钻了66个窟窿,邻居:只要我高兴你管不着!

男子新房的房顶被邻居钻了66个窟窿,邻居:只要我高兴你管不着!

鬼谷子思维
2024-05-27 17:42:50
贾玲高调宣布喜讯:果然,她的变化令人瞠目结舌!

贾玲高调宣布喜讯:果然,她的变化令人瞠目结舌!

听风听你
2024-05-27 21:38:36
“辽老大”发力!关键时刻,省委书记、省长等出席重要会议,释放这一信号

“辽老大”发力!关键时刻,省委书记、省长等出席重要会议,释放这一信号

政知新媒体
2024-05-28 20:46:36
龙赛罗:莫德里奇续约已敲定,老佛爷对其降薪要求感到惊讶

龙赛罗:莫德里奇续约已敲定,老佛爷对其降薪要求感到惊讶

懂球帝
2024-05-29 04:21:08
鬼魅攻防!李凯尔出战25分钟得到2分4板4助3断 没有失误

鬼魅攻防!李凯尔出战25分钟得到2分4板4助3断 没有失误

直播吧
2024-05-29 11:17:19
为什么女性在海边或T台上,可以穿内衣,而平时路上又怕走光露出

为什么女性在海边或T台上,可以穿内衣,而平时路上又怕走光露出

室内设计师阿喇
2024-05-29 02:17:05
2024-05-29 17:46:44
moonfdd
moonfdd
福大大架构师每日一题
405文章数 7关注度
往期回顾 全部

科技要闻

王传福再放狠话,燃油车要成“非主流”

头条要闻

安徽全椒县"拿茅台比方污水"局长被免职

头条要闻

安徽全椒县"拿茅台比方污水"局长被免职

体育要闻

巴黎主席向皇马索要8000万 佛爷:1分不给

娱乐要闻

张若昀怎么剧外比剧内更惨兮兮…

财经要闻

东方通收购藏雷 花6亿买来"业绩变脸"

汽车要闻

新哈弗H6苦练内功 向燃油车绝缘智能SAY NO

态度原创

旅游
亲子
时尚
数码
公开课

旅游要闻

希尔顿一会员退房时被罚3000元,理由令人震惊

亲子要闻

六一儿童汇演能有多搞笑,男孩模仿宋小宝“咖妃”名场面,网友:当代小孩黑历史都是高清的

夏天穿搭适合多点色彩!建议试试蓝色、浅黄、紫色,亮眼时髦

数码要闻

骁龙X Elite笔记本将支持微软自动超级分辨率 但该功能并非高通SoC机型独有

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版