#include<cstdio>
#include<iomanip>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<unordered_map>
#define Quick ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define P pair<int,int>
#define inf 0x3f3f3f3f
#define endl '\n'
#define PI acos(-1)
#define mem(a, b) memset(a, b, sizeof a)
using namespace std;
const int N =2007;
const int mod = 1e9 + 7;
ll a[N];
ll dp[N][N];
int main()
{
    Quick;

    //重新排序使其在每一位上的（max-min）总和最小

    int n; cin >> n;
    for (int i = 0; i < n; i++)cin >> a[i];
    sort(a, a + n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            dp[i][j] = 1e12;//初始dp数组保留最大值。
        }
    }
    //初始化dp数组。
    dp[0][0] = a[n - 1] - a[0];
    //减小这个差值，可以删掉一个最小的或者最大的
    for (int i = 1; i < n; i++)
    {
        //只删除最大值i次
        dp[i][0] = dp[i - 1][0] + a[n - i - 1] - a[0]; //删除最大值从右边删除，那么删除之后当前最大值就是a[n-i-1];
        //只删除最小值i次
        dp[0][i] = dp[0][i - 1] + a[n - 1] - a[i];     //删除最小值从左边删除，那么删除之后当前最小值就是a[i]。
    }

    //接下来开始进行状态转移取最优。
    for (int i = 1; i < n; i++) {
        for (int j = 1; i + j < n; j++) {
            //i+j不得超过n次。
            dp[i][j] = min(dp[i][j], dp[i - 1][j] + a[n - i - 1] - a[j]);//选择删除最大值
            dp[i][j] = min(dp[i][j], dp[i][j - 1] + a[n - i - 1] - a[j]);//选择删除最小值
        }
    }
    ll res = 1e12;
    for (int i = 0; i < n; i++) {
        res = min(res, dp[i][n - i - 1]);
    }
    cout << res << endl;
}