这里是引用
问题描述
对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
第一行一个数表示数据组数
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
笔者这里先判断了选择数字的情况,负数的个数以及最后零的个数,
函数 def chuli():中 变量 i 和 length可以理解为指针 指向代表是当前位置,是否要选择这个数
def chuli(num_list,count):
i = 0
length = len(num_list)
num = 1
while count != 0:
if num_list[i] == 0:
i += 1
if num_list[i]*num_list[i+1] >= num_list[length-2]*num_list[length-1]:
num *= num_list[i]
count -= 1
i += 1
elif count >= 2:
num *= num_list[length-1]*num_list[length-2]
length -= 2
count -= 2 #取负数的情况正数指针不加一
else:
num *= num_list[i]
count -= 1
i += 1
return num
group_nums = int(input())
res = []
for i in range(group_nums):
num = 1
count = 0
guiding = list(map(int,input().split())) #数字几个取出几个
num_list = list(map(int,input().split()))[:guiding[0]]
num_list.sort(reverse=True)
# final_list = []
# zero = 0
# for x in num_list:
# if x != 0 :
# final_list.append(x)
# elif x < 0:
# count += 1
# else:
# zero += 1
# final_list.sort(reverse= True)
if guiding[1] == 1: #只选一个
res.append(num_list[0])
# elif zero >= guiding[0] - guiding[1]:
# res.append()
else:
if count == 1: #一个负数
for x in range(guiding[1]):
num*= num_list[x]
res.append(num)
else:
res.append(chuli(num_list,guiding[1]))
for i in res:
print(i)
如有更好算法,欢迎评论区留言O(∩_∩)O