题目大意:给定n个餐馆位置,要求在n个餐馆中选择m个作为仓库,使得总距离最小
d[i][k]:在前i个餐馆中选择k个作为仓库的最小总距离
d[i][k]=min(d[i][k],d[s][k-1]+MinDis(s+1,i));
MinDis(s+1,i) :在s+1到i中选择一个餐馆作为仓库的最小距离
#include <bits/stdc++.h>
using namespace std;
#define maxn 205
#define maxn2 35
int dd[maxn];
int d[maxn][maxn2];
int dis(int as,int ad)
{
int mid=(as+ad)/2;
int sum=0;
for (int i=as;i<=ad;i++){
sum+=fabs(dd[i]-dd[mid]);
}
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
int testcase=1;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m){
for (int i=1;i<=n;i++){
scanf("%d",&dd[i]);
}
sort(dd+1,dd+n+1);
for (int i=1;i<=n;i++){
d[i][1]=dis(1,i);
}
for (int i=2;i<=n;i++){
for (int k=2;k<=m;k++){
d[i][k]=1<<30;
for (int s=1;s<i;s++){
d[i][k]=min(d[i][k],d[s][k-1]+dis(s+1,i));
}
}
}
printf("Chain %d\n",testcase++);
printf("Total distance sum = %d\n\n",d[n][m]);
}
return 0;
}