悬赏100 求一个编程问题 matlab 或C++都行

把9个数字分配成4部分,每部分中的元素(所分配的数字)总和满足0<si<45;求满足每一部分sum[(37-si)^2]的方差最小的一组组合;即min sum[(37-s)^2]
说明:sum[(37-si)^2]=sum[(37-s1)^2+(37-s2)^2+(37-s3)^2+(37-s4)^2] ; 9个初始数据8 9 10 25 27 30 12 13 14 ;每个数据必须分配完
若是哪位大侠能做出来,100个财富悬赏!
全部递归搜索每个可能,结果分组可能不是唯一的解,但结果是最优解!

#include<iostream>
using namespace std;

#define MAX_N 9
#define MAX_M 45
#define MAX_S 37

int t=0,t1=0,tt=0;

template<typename T>
void Whole_Array(T V[],const int A,const int Z)
{
if(A==Z-1) {for(int i=0;i<Z;i++) CR(V,Z);
}
else for(int i=A;i<Z;i++) {swap(V[i],V[A]);Whole_Array(V,A+1,Z);swap(V[i],V[A]);}
}

template<typename T>
void CR(T V[],const int Z)
{
if(Z<4) return ;
register i,j,k,p;
T *value=new T[Z];

for (i=0;i<=Z-4 ;i++)
{
for (p=0,value[0]=0;p<=i;p++)value[0]+=V[p];
if(value[0]>=MAX_M)break;
for (j=i+1,value[1]=0;j<=Z-3 ;j++)
{
for (p=i+1,value[1]=0;p<=j;p++)value[1]+=V[p];
if(value[1]>=MAX_M)break;
for (k=j+1;k<=Z-2 ;k++)
{
for (p=j+1,value[2]=0;p<=k;p++)value[2]+=V[p];
if(value[2]>=MAX_M)break;
for (p=k+1,value[3]=0;p<Z;p++)value[3]+=V[p];
if(value[3]>=MAX_M)break;

t1 = (37-value[0])* (37-value[0])+ (37-value[1])* (37-value[1])
+(37-value[2])* (37-value[2])+ (37-value[3])* (37-value[3]);
tt++;
if(t1<t||t==0)
{
t=t1;
cout<<t1<<" ";
for (p=0;p<4;p++)
cout<<value[p]<<" "旅运虚; cout<<" (";
for (p=0;p<=i;p++)
cout<<V[p]<<" "; cout<<"),(";
for (p=i+1;p<=j;p++)
cout<<V[p]<<" "; cout<<"),(";
for (p=j+1;p<=k;p++)
cout<<V[p]<<" "; cout<拆燃<"),(";
for (p=k+1;p<Z;p++)
cout<<V[p]<<" "; cout<<悄郑")";
cout<<endl;
}
}
}
}
delete []value;
}

void main()
{
int N[]={8 ,9 ,10 ,25, 27 ,30 ,12 ,13 ,14 };
cout<<"满足条件的方差(si<45),由从大到小依次为:"<<endl;
Whole_Array(N,0,MAX_N);
cout<<"输出完成! 共计算搜索"<<tt<<"次"<<endl;
}