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)

你可能感兴趣的:(python)