原料厂选择问题

问题描述: 
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;
  }

 

posted on 2012-05-08 17:32  aho  阅读(305)  评论(0编辑  收藏  举报

导航