#include <iostream>
using namespace std;
int n; //部件的编号
int m; //供应商编号
int d; //总价格的限制
int w[100][100] = {0};
int c[100][100] = {0};
int sum = 10000; //总重量
int currentWeight = 0; //当前重量
int currentPrice = 0; //当前费用
int x[100] = {0};
int best[100] = {0};
void backtrack(int i)
{
if(i >= n)
{
if(currentWeight < sum)
{
sum = currentWeight; //更新
for(int j=0; j<n; j++)
{
best[j] = x[j]; //最佳选择序列
}
}
return;
}
for(int j=0; j<m; j++)
{
currentWeight += w[i][j]; //第i个物品的第j个供应商提供的重量
currentPrice += c[i][j];
if(currentWeight<=sum && currentPrice<=d) //当前价格不超过d,剪枝
{
x[i] = j; //标识第i个物品选的是哪一个供应商
backtrack(i+1); //看下一个物品
}
currentWeight -= w[i][j]; //将该物品拿出来
currentPrice -= c[i][j];
}
}
int main()
{
cin >> n >> m >> d;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin >> w[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin >> c[i][j];
// sum += c[i][1];
}
}
// for(int i=0; i<n; i++)
// {
// for(int j=0; j<m; j++)
// {
// cout << " " <<w[i][j] << " " << c[i][j];
// }
// cout << endl;
// }
backtrack(0);
bool flag = true;
for(int i=0; i<n; i++)
{
if(flag)
{
cout << best[i] + 1;
flag = false;
}
else
{
cout << " " << best[i] + 1;
}
}
// cout << best[i]+1 << " ";
cout << endl;
cout << sum << endl;
return 0;
}
求解最小机器重量设计问题
最新推荐文章于 2025-05-26 16:40:01 发布