有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。
代码如下:
#include<iostream>using namespace std;int min_diff(int data[],int n,int &min_i,int &min_j,int number);int main(){int number,n,i;cin>>number>>n;int *data=new int[n];for(i=0;i<n;i++)cin>>data[i];int min_i,min_j;int min_d=min_diff(data,n,min_i,min_j,number);int sum=0;for(i=min_i;i<min_j;i++){sum=sum+data[i];cout<<data[i]<<" + ";}sum=sum+data[i];cout<<data[i]<<" = "<<sum<<endl;cout<<"The min difference with "<<number<<" is "<<min_d<<endl;delete []data;return 0;}int min_diff(int data[],int n,int &min_i,int &min_j,int number){if(data==NULL||n<=0)return 0;int i=0,j=0;min_i=i;min_j=j;int min_d=0x7fffffff;int sum=data[0];while(i<=j&&j<n){if(sum==number){min_i=i;min_j=j;min_d=0;break;}else if(sum>number){if(sum-number<min_d){min_d=sum-number;min_i=i;min_j=j;}sum=sum-data[i];i++;}else{if(number-sum<min_d){min_d=number-sum;min_i=i;min_j=j;}j++;sum=sum+data[j];}}return min_d;}时间复杂度度为O(n),空间复杂度为O(1).