D. 数组对乘积和最大(dfs-排列树)
【问题描述】
给两组数,各n个。请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
【输入形式】
第一行包括一个整数,代表整数的个数。
第二行是第一组数,用空格分开。
第三行是第二组数,用空格分开。
【输出形式】
输出乘积的和
【样例输入】
第一组
3
1 3 -5
-2 4 1
第二组
5
1 2 3 4 5
1 0 1 0 1
【样例输出】
第一组
-25
第二组
6
n=int(input())
l1=list(map(int,input().split()))
l2=list(map(int,input().split()))
def f(a,b):
m=0
for i in range(len(a)):
m+=a[i]*b[i]
return m
ans=f(l1,l2)
def dfs(i):
global l2
global ans
if i==n:
if f(l1,l2)<ans:
ans=f(l1,l2)
else:
for j in range(i,n):
l2[i],l2[j]=l2[j],l2[i]
dfs(i+1)
l2[i],l2[j]=l2[j],l2[i]
dfs(0)
print(ans)