huaweiOD机试题跳房子ii
题的具体描述没看清楚,描述用例差不是这样
[1,2,4,5,0] 第一行输入数组
9 第二行输入一个标记数
[4,5,0] 第三行输出一个子数组,使子数组的和为标记数,子数组是最长子数组。
Python代码实现,参考leetcode39组合总和实现。
def fun(lists, target):
n = len(lists)
results=[]
# sum是当前的选择,track 是路径
def backtrack(sum,lists_new, track):
# 路径结束,不满足约束条件
if sum > target :
return
# 路径结束,满足约束条件
if sum == target:
results.append(track)
return
for j in range(len(lists_new)):
# 更新选择列表和路径,递归
backtrack(sum + lists_new[j],lists_new[j+1:n+1], track + [lists_new[j]])
backtrack(0,lists,[])
return results
if __name__ == __main__:
# ss=input()
# target=int(input())
# ss_new=ss[1:-1]
# lists=list(map(int,ss_new.split(",")))
#lists_new=sorted(lists)
# res=fun(lists,target)
lists=[1, 2, 3, 5, 4, 0, 4, 0, 9]
lists_new = sorted(lists)
res=fun(lists_new, 9)
print(res)
if res==[]:
print(-1)
else:
ll=0
index=-1
for i in range(len(res)):
if len((res[i]))>ll:
ll=len((res[i]))
index=i
rr=res[index]
ree=[]
for ele in lists:
if ele in rr:
ree.append(ele)
rr.remove(ele)
if rr==[]:
break
print(ree)
下一篇:
拓扑排序(DAG图上的BFS)
