1. 程式人生 > >藍橋杯-演算法訓練-最小乘積(基本型)

藍橋杯-演算法訓練-最小乘積(基本型)

演算法訓練 最小乘積(基本型) 問題描述   給兩組數,各n個。
  請調整每組數的排列順序,使得兩組資料相同下標元素對應相乘,然後相加的和最小。要求程式輸出這個最小值。
  例如兩組數分別為:1 3  -5和-2 4 1

  那麼對應乘積取和的最小值應為:
  (-5) * 4 + 3 * (-2) + 1 * 1 = -25 輸入格式   第一個行一個數T表示資料組數。後面每組資料,先讀入一個n,接下來兩行每行n個數,每個數的絕對值小於等於1000。
  n<=8,T<=1000 輸出格式   一個數表示答案。 樣例輸入
2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1


樣例輸出


-25
6
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T>0)
	{
		int n,min,sum=0;
		cin >> n;
		int dig1[8];
	        int dig2[8];
		for (int i = 0; i < n; i++)
			cin >> dig1[i];
		for (int i = 0; i < n; i++)
			cin >> dig2[i];
		for (int i = 0; i < n; i++)
		{
			sum = sum + dig1[i]*dig2[i];
		}
		min = sum;   //給min賦初值
		sort(dig1,dig1+n);  //減小複雜度
		sort(dig2,dig2+n);
		do
		{
			do
			{
				sum = 0;
				for (int i = 0; i < n; i++)
				{
					sum = sum + dig1[i] * dig2[i];
				}
				if (sum <min)
				{
					min = sum;
				}
				if (sum > min)
					break;
			} while (next_permutation(dig2, dig2+ n));
		} while (next_permutation(dig1,dig1+n));
		cout << min << endl;
		T--;
	}
	return 0;
}