题目
设某一机器由n个部件组成,部件编号为1~n,每一种部件都可以从m个供应商处购得,供应商编号为1~m。设w[i][j]是从供应商j处购得的部件i的重量,c[i][j]是相应的价格。对于给定的机器部件重量和机器部件的价格,计算总价不超过cost的最小重量机器设计,要求在同一个供应商处最多只购得一个部件。
输入描述
第1行输入3个整数,n、m、cost,接下来n行输入w[i][j](每行m个整数),最后n行输入c[i][j](每行m个整数),1<=n,m<=100。
输出描述
输出的第一行包括n个整数,表示每个对应的供应商编号,第2行为对应的重量。
输入样例
3 3 7
1 2 3
3 2 1
2 3 2
1 2 3
5 4 2
2 1 2
输出样例
1 3 1
4
代码
#include<iostream>
#include<stdio.h>
using namespace std;
int w[100][100];//w[i][j]为第i个零件在第j个供应商的重量
int c[100][100];//c[i][j]为第i个零件在第j个供应商的价格
int bestx[100];//bestx[i]表示一次搜索到底后的最优解,用来存放第i个零件的供应商,
int x[100];//x[i]临时存放第i个零件的供应商
int cw = 0, cc = 0, bestw = 10000;
int cost;//限定价格
int n;//部件数
int m;//供应商数
void Backtrack(int t)
{
int j;
if (t > n)//搜索到叶子结点,一个搜索结束,所有零件已经找完
{
bestw = cw;//当前最小重量
for (j = 1; j <= n; j++)
bestx[j] = x[j];
}
else
{
for (j = 1; j <= m; j++)
{
if (cc + c[t][j] <= cost && cw + w[t][j] < bestw)
{
x[t] = j;
cc += c[t][j];
cw += w[t][j];
Backtrack(t + 1);
cc -= c[t][j];
cw -= w[t][j];
}
}
}
}
int main()
{
//cout << "-----------------------------------" << endl;
int i, j;
//cout << "请输入部件数:";
cin >> n;
//cout << endl << "请输入供应商数:";
cin >> m;
//cout << endl << "请输入限定价格:";
cin >> cost;
//cout << endl << "-----------------------------------" << endl;
//cout << "请输入各部件的在不同供应商的重量:" << endl;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> w[i][j];
// cout << "w[" << i << "][" << j << "] = " << w[i][j] << endl;
}
cout << endl;
}
//cout << endl << "-----------------------------------" << endl;
//cout << "请输入各部件的在不同供应商的价格:" << endl;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> c[i][j];
// cout << "c[" << i << "][" << j << "] = " << c[i][j] << endl;
}
cout << endl;
}
Backtrack(1);
//cout << "每个部件的供应商:" << endl;
//cout << endl << "-----------------------------------" << endl;
for (i = 1; i <= n; i++)
cout << bestx[i] << ' ';
cout << endl;
cout << bestw;
cout << endl;
system("pause");
return 0;
}
以下为我的微信公众号:技术经理的成长
会不定期进行更新,欢迎关注