原料厂选择问题
问题描述:
12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、31、38、39、47.在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,问应该选哪三个厂 ?
问题解答:
拿到题目后本想使用动态规划来做,怎奈感觉运用不上,只好采取枚举的笨方法。若有好的方法还望指教,下面枚举的程序:
#include <iostream> #include <math.h> #include <stdlib.h> using namespace std; #define N 12 #define M 3 #define MAX 100000000 int get_min(int* ch) { int min = ch[0]; for (int i = 1; i < M; i++) { if (min > ch[i]) { min = ch[i]; } } return min; } int choose(int* coor, int* ch) { int dis = 0; int dis_M[M] = {0}; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { dis_M[j] = abs(coor[i] - coor[ch[j]]); } dis += get_min(dis_M); } return dis; } int main() { int coor[N] = {0, 4, 5, 10, 12, 18, 27, 30, 31, 38, 39, 47}; int chos[M]; int chos_tmp[M]; int dis = MAX; for (int i = 0; i < N - 2; i++) { chos_tmp[0] = i; for (int j = i + 1; j < N - 1; j++) { chos_tmp[1] = j; for (int z = j + 1; z < N; z++) { chos_tmp[2] = z; int dis_tmp = choose(coor, chos_tmp); if (dis_tmp < dis) { dis = dis_tmp; for (int y = 0; y < M; y++) { chos[y] = chos_tmp[y]; } } } } } for (int y = 0; y < M; y++) { cout << coor[chos[y]] << "\t"; } cout << endl; cout << "dis: " << dis << endl; return 0; }