Problem Description
在一条高速公路上有 n 个快餐店(0<n<=200),现在要在这 n 个快餐店位置里面选区 k 个位置作为仓库的位置(0<k<=30) 。每个快餐店由最近的仓库供应。第一行 输入 n 和k , k< n;下面n行输入n个整数(d1 < d2 < … < dn)。总的运输代价sum等于下表的计算值。要求sum最小。求最小值。
分析:
显然这是一道动态规划的题目。按照运筹学的最优化原理:无论过去的状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优策略。每一个最优策略只能由最优子策略构成。由此导致了分阶段决策的方法。
另:若在 i 餐厅和 j 餐厅之间的餐厅均由一个仓库供应。则,最优策略为:这个仓库在 i 与 j 之间。可选取 (i+j)/2 的位置。然后计算所有餐厅到仓库的距离之和。
解决:
用array[i][j]表示前 j 个餐厅中有 i 个仓库时的最优策略下的运输代价。
则状态转移方程为:
array[i][j] = min(array[i-1][j],( i-1<=temp <= j){ array[i-1][temp]+ cost[tmep][j]} )
含义为:前 j 个餐厅有 i i i个仓库的最优策略为:
1,前 j 个餐厅有 i − 1 i-1 i−1 个仓库的最优策略
2,新加了一个餐厅。利用最优子策略组合,再选取其中的最优策略。有j-(i-1)个组合结果。分别代表新加的仓库负责:1)第i 至 j 个餐厅 2) 第i +1至 j 个餐厅 …
代码
由于经常需要运输代价的数据,为了降低时间复杂度,将所有的运输代价存在costArray表中。
#include <stdio.h>
#include <stdlib.h>
int dist1[30];
int array[30][