兩個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;
}
上面代碼的輸出部分增加了,最後得到的最小點積所對應的向量元素的排列。