好好琢磨一下吧 DP....
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[2222][2222];
int min( int a,int b ){ return a<b?a:b; }
bool cmp( int a,int b ){ return a<b; }
int powsum( int a,int b ){ return (a-b)*(a-b); }
int main()
{
int N,K;
int g[2222];
while( scanf( "%d %d",&N,&K )!=EOF )
{
for( int i=1;i<=N;i++ )
scanf( "%d",&g[i] );
sort( g+1,g+N+1,cmp );
for( int i=0;i<=N;i++ )
for( int j=1;j<=K;j++ )
f[i][j]=INT_MAX;
for( int i=2;i<=N;i++ )
for( int j=1;j*2<=i;j++ )
f[i][j]=min( f[i-1][j],f[i-2][j-1]+powsum(g[i],g[i-1]) );
printf( "%d\n",f[N][K] );
}
return 0;
}