向量點乘最小值

兩個n維的向量,向量的點乘是指將向量對應維度的乘積相加,但是我們可以將向量維度交換下可以得到更小的向量點乘,例如3維向量:【1, 3, −5】和【4, −2, −1】,最小向量點乘爲-27,即將維度變爲:[3,1,-5]和[-2,-1,4],程序設計要求:輸入一個整數n爲向量的維度,然後輸入兩個n維度的向量,用空格區別向量元素,輸出爲一行,包含一個整數,爲最小的點乘。

我寫的代碼爲:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fun(int*,int*,const int);
void main()
{
	cout<<"please enter the dimension of the vetor: ";
	int n;
	cin>>n;
	cout<<"the first vector: ";
	int *x=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>x[i];
	}
	cout<<"the second vector:";
	int *y=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>y[i];
	}

	cout<<fun(x,y,n);

}

int fun(int* A,int *B,const int n)
{
	int temp=0,temp1=0,index=0;
	vector<int> vec;
	for(int i=0;i<n;i++)
	{
		vec.push_back(i);
	}
	sort(vec.begin(),vec.end());
	for(int i=0;i<n;i++)
	{
		temp1+=A[i]*B[i];
	}
	while(next_permutation(vec.begin(),vec.end()))
	{
		for(int i=0;i<n;i++)
		{
			index=vec[i];
			temp+=A[index]*B[i];
		}
		if(temp<temp1) temp1=temp;
		temp=0;
	}
	return temp1;
}
寫程序遇到最大的問題是怎麼將一個數組全排列,自己寫代碼沒寫成功,後來查了下有沒有這樣的函數,發現c++中對容器或者數組可以進行全排列的函數爲sort(),next_permutation(),這樣就解決了全排列遍歷的問題,程序中我將其中一個向量的指標index進行全排列,然後分別計算出點積的大小,返回最小值。

當然也可以直接對其中一個向量的元素進行全排列,然後計算出對應的點積,返回最小值:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fun(int*,int*,const int);
inline void res(int *H,int n);
inline int fac(int x);
void main()
{
	cout<<"please enter the dimension of the vetor: ";
	int n;
	cin>>n;
	cout<<"the first vector: ";
	int *x=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>x[i];
	}
	cout<<"the second vector:";
	int *y=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>y[i];
	}

	cout<<fun(x,y,n);

}

int fun(int* A,int *B,const int n)
{
	int temp=0,temp1=0,index=0;
	for(int i=0;i<n;i++)
	{
		temp1+=A[i]*B[i];
	}
	sort(A,A+n);
	vector<int> vec;
	while(next_permutation(A,A+n))
	{
		for(int i=0;i<n;i++)
		{
			temp+=A[i]*B[i];
		}
		if(temp<temp1)
		{
			temp1=temp;
			vec.clear();
			vec.insert(vec.begin(),A,A+n);
		}
		temp=0;
	}
	for(vector<int>::iterator ite=vec.begin();ite<vec.end();ite++)
		cout<<*ite<<'\t';
	cout<<endl;
	return temp1;
}
上面代碼的輸出部分增加了,最後得到的最小點積所對應的向量元素的排列。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章