dp[i][j] = min(dp[i][j], dp[k-1][j-1]+i*(sum[i]-sum[k-1]))
sum表示将n个数从大到小排序后的前缀和
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#define INF 0x3f3f3f3f
#define eps 1e-6
#define PI 3.1415926
#define mod 1000000007
#define base 2333
using namespace std;
typedef long long LL;
const int inf = 1e9;
const int maxn = 1e2 + 10;
const int maxx = 5e6 + 10;
int t, n, m, a[maxn], sum[maxn], dp[maxn][maxn];
bool cmp(int a, int b) {
return a > b;
}
void solve() {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a+1, a+n+1, cmp);
memset(sum, 0, sizeof(sum));
memset(dp, INF, sizeof(dp));
for(int i = 1; i <= n; i++)
sum[i] = sum[i-1]+a[i];
dp[0][0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
for(int k = 1; k <= i; k++)
dp[i][j] = min(dp[i][j], dp[k-1][j-1]+i*(sum[i]-sum[k-1]));
}
}
printf("%.4f\n", dp[n][m]*1.0/sum[n]);
}
}
int main() {
//srand(time(NULL));
//freopen("perechi3.in","r",stdin);
//freopen("perechi3.out","w",stdout);
solve();
}