您的位置:首页 > 其它

原料厂选择问题

2012-05-08 17:32 162 查看
问题描述:
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
= {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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: