华为OD机试真题:分糖果-均分【2022 Q1 Q2 |200分】

题目描述:
现有几袋糖果,老师要将糖果分给小张和小王两个同学,每一袋都有一定数量的糖果,每袋糖果只能全部分给他们其中一人,要求最终两人分得糖果的数量相同。


输入:糖果的袋数和各袋中糖果的数量;



输出:平分下来的糖果数量,以及两个人分别分到的各袋中糖果的数量,如果无法平分,则直接输出-1


示例1:
1.输入:
             5
             2 6 5 4 7
  输出:
             12
             2 4 6
              5 7
    
 2.输入:
             4
             1 2 3 5
  输出:
            -1

#解题想法:再背包问题的基础上,增加一个记录当前节点的满足条件的list




m=5
l=[2,6,5,4,7]

su=sum(l)
if su%2==1:
    print(-1)
else:
    t=int(su/2)

    dp=[[False]*(t+1) for _ in range(0,len(l))]
    print(dp)
    dp[0][l[0]]=True
    for i in range(0,len(l)):
        dp[i][0]=True

    dp2 = [[""] * (t + 1) for _ in range(0, len(l))]
    print(dp2)
    dp2[0][l[0]] = str(l[0])


    for i in range(1,len(l)):
        for j in range(1,t+1):
            if j>l[i]:
                dp[i][j]=dp[i-1][j]|dp[i-1][j-l[i]]

                if dp[i-1][j]:
                    dp2[i][j]=dp2[i-1][j]
                if dp[i-1][j-l[i]]:
                    dp2[i][j] =dp2[i-1][j-l[i]]+str(l[i])

            else:
                dp[i][j]=dp[i-1][j]
                dp2[i][j] = dp2[i - 1][j]
    print(dp)

    if dp[-1][-1]:

        tmp=list(map(int,list(dp2[-1][-1])))

        tmp2=list(set(l)-set(tmp))

        tmp.sort()

        tmp2.sort()

        for i in tmp:
            print(i,end=" ")
            
        print()

        for i in tmp2:
            print(i,end=" ")


    else:
        print(-1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值