小红得到了一个阵法。 她想取一些数字使数字之和尽可能大,但要求和必须是k的倍数。 你能帮帮她吗?

小红取数
时间限制:1秒 空间限制:256M
描述
小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。
你能帮帮她吗?
输入描述:
第一行输入两个正整数 n 和 k
第二行输入 n 个正整数 ai

1≤n,k≤10**3
 1 ≤ ai ≤ 1 0 **10

输出描述:
如果没有合法方案,输出 - 1。
否则输出最大的和。

我写的比较简单和直观的 代码如下:

while True:
    n,k=map(int,input().strip().split(' '))
    if n >= 1 and n <= 10**3 and k >= 1 and k <= 10**10:
        break
    else:
        print('n或k输入超过范围1≤n,k≤10**3,1 ≤ ai ≤ 1 0 **10')



# arr = [int(input()) for _ in range(n)]
arr=[13,14,17,1,2]#list(map(int,input().split(' ')))
# arr=list(map(int,input().strip().split(' ')))

while True:
    arr=list(map(int,input().strip().split(' ')))
    if n == len(arr):
        break
    else:
        print('输入{}个数:'.format(n))

# print(n,k,arr)

'''求数组的所有子集res'''
res=[[]]
for i in arr:
    # print('i=',i)
    for j in res[:]:
        # print('j,x==',j)
        x=j[:]
        x.append(i)
        # print('x==', x)
        res.append(x)
        # print('res===',res)
print(res)

'''求各子集元素和的最大值,并降序排列'''
res1={}
for i in range(len(res)):
    res1[i]=sum(res[i])
res1=dict(sorted(res1.items(), key=lambda x: x[1], reverse=True))
print(res1)

'''取能够被K整除的最大值'''
result=-1
for i in res1:
    if res1[i]%k==0 and res1[i]!=0:
        result=res1[i]
        print(i,res1[i],res[i])
        break

print(result)
物联沃分享整理
物联沃-IOTWORD物联网 » 小红得到了一个阵法。 她想取一些数字使数字之和尽可能大,但要求和必须是k的倍数。 你能帮帮她吗?

发表评论