算法设计与分析实验二-回溯法

【问题1】某台机器有n个部件组成,每个部件都可以m个不同供应商处购买,已知从j个供应商购买第i个部件的重量和从j个供应商购买第i个部件的价格,求总价格不超过c且重量最小的机器部件购买方案。

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> vWeight;
vector<vector<int>> vPrice;

int nMaxCost;
int n, m;

int nMinWeight = 999;
vector<int> minList;

void BuyComponent(int k, int curCost, int curWeight, vector<int> curList)
{
	if (k > n)
	{
		if (nMinWeight > curWeight)
		{
			nMinWeight = curWeight;
			for (int i = 0; i < curList.size(); i++)
			{
				minList[i] = curList[i];
			}
		}
	}
	else
	{
		for (int j = 0; j < m; j++)
		{
			if (curCost + vPrice[k - 1][j] <= nMaxCost && curWeight < nMinWeight)
			{
				curList[k - 1] = j + 1;
				BuyComponent(k + 1, curCost + vPrice[k - 1][j], curWeight + vWeight[k - 1][j], curList);
			}
		}
	}
}

int main()
{
	cin >> n >> m >> nMaxCost;

	for (int i = 0; i < n; i++)
	{
		vector<int> vWeightLine;
		for (int j = 0; j < m; j++)
		{
			int w;
			cin >> w;
			vWeightLine.push_back(w);
		}
		vWeight.push_back(vWeightLine);
	}

	for (int i = 0; i < n; i++)
	{

		vector<int> vPriceLine;
		for (int j = 0; j < m; j++)
		{
			int p;
			cin >> p;
			vPriceLine.push_back(p);
		}
		vPrice.push_back(vPriceLine);
	}

	vector<int> curList;

	for (int i = 0; i < n; i++)
	{
		curList.push_back(0);
		minList.push_back(0);
	}

	BuyComponent(1, 0, 0, curList);
	cout << endl;
	for (int j = 0; j < n; j++)
	{
		cout << minList[j] << " ";
	}
	cout << endl << nMinWeight << endl;
}

【问题2】有n个城市,用1、2、…、n表示,城市i与城市j之间的距离为dij。有一个货郎要从城市1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线可以使总路程最短?

#include <iostream>
#include <vector>

using namespace std;

const int INF = 9999;

int n;

vector<vector<int>> vCity;

vector<int> vPermCity;

int nCurDistance = 0;

int nMinDistance = INF;

vector<int> minPath;

void swap(int& a, int& b)
{
	int t = a;
	a = b;
	b = t;
}

void SelectPath(int k)
{
	int m = vPermCity.size();

	if (k > m)
	{
		nCurDistance = vCity[0][vPermCity[0] - 1];
		for (int i = 0; i < m - 1; i++)
		{
			nCurDistance += vCity[vPermCity[i] - 1][vPermCity[i + 1] - 1];
		}

		nCurDistance += vCity[vPermCity[m - 1] - 1][0];

		if (nCurDistance < nMinDistance)
		{
			nMinDistance = nCurDistance;
			for (int j = 0; j < m; j++)
			{
				minPath[j + 1] = vPermCity[j];
			}
		}
	}
	else
	{
		for (int j = 0; j < k; j++)
		{
			swap(vPermCity[j], vPermCity[k - 1]);

			SelectPath(k + 1);
			swap(vPermCity[j], vPermCity[k - 1]);
		}
	}
}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		vector<int> vDistanceLine;

		for (int j = 0; j < n; j++)
		{
			int d;
			cin >> d;
			vDistanceLine.push_back(d);
		}
		vCity.push_back(vDistanceLine);
	}

	minPath.push_back(1);

	for (int i = 0; i < n - 1; i++)
	{
		vPermCity.push_back(i + 2);
		minPath.push_back(0);
	}
	minPath.push_back(1);

	SelectPath(1);

	for (int j = 0; j < n + 1; j++)
	{
		cout << minPath[j] << " ";
	}
	cout << endl << nMinDistance << endl;
}
上一篇 下一篇
内容结束