最优仓库布局方案实验 动态规划 算法设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
描述
A公司沿着高速公路开设了n 个连锁超市1,2,…,n.这n 个超市距公司总部的距离分别为d1 < d2 <…< dn.公司总部决定近期在这n 个超市中选择m 个超市来增设货品仓库.每个仓库可以为若干个超市提供货物,且每个超市恰有1 个仓库为其供货.
设为第k个超市供货的仓库位于超市f (k),其送货距离g(k)=|d(k)- d f (k ) |,公司总部认为最优的仓库布局方案应使总送货距离∑g(k)(1<=k<=n)达到最小的最优仓库布局方案。
对于给定的n 个超市距公司总部的距离d1 < d2 <…< dn 和欲设置的仓库数m <=n ,计算出使总送货距离∑g(k)(1<=k<=n)达到最小的最优仓库布局方案。
输入
第1 行中的2 个整数为n和m,且满足1 <= n <= 200,1<= m<= 130,m<= n。
接下来的n行中每行一个整数,依次为d1, d2, …, dn 。
输出
将计算出的最小总送货距离输出
样例输入
6 3
5
6
12
19
20
27
样例输出
8
代码:
#include "stdafx.h"
#include "stdio.h"
#include<string.h>
#include<algorithm>
using namespace std;
int a[105],minvalue;
int dp[105][105];
int Min(int b[],int n,int m)
{
int min=b[n-1],j;
for(j=n-1;j>=m-1;
j--) if(b[j]<min) min=b[j];
return min;
};
int f(int n,int m)
{
if(dp[n][m]!=-1) return dp[n][m];
int b[105],j,p;
if(m==1)
{
p=a[n]-a[1];
dp[n][m]=p;
return p;
}
if(m==n)
{
dp[n][m]=0;
return 0;
}
else
{
for(j=n-1;j>=m-1;j--)
{
p=a[n]-a[j+1]; b[j]=f(j,m-1)+p; }
}
dp[n][m]=Min(b,n,m);
return dp[n][m];
};
int main()
{
int i,n,m;
scanf("%d",&n);
scanf("%d",&m);
a[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
/* j=i;
while(a[j]<a[j-1])
{
tap=a[j]; a[j]=a[j-1]; a[j-1]=tap; j--; }
*/
}
// QuickSort(a,1,n);
// MergeSort(a,n+1);
sort(a+1,a+n+1);
memset(dp,-1,sizeof(dp));
// for(i=1;i<=n;i++)
// printf("%d",a[i]);
minvalue=f(n,m);
printf("%d\n",minvalue);
return 0;
}
结果:。