#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
#define maxn 1000
int n;//部件个数
int m;//供货商个数
int max_c;//最大价格
int w[maxn][maxn];//价格
int c[maxn][maxn];//费用
int cc;//当前价格
int cw;//当前重量
int bestw=0x3f3f3f;//最小重量
int bestx[maxn];//最优解向量
int x[maxn];//当前解向量
void BackTrack(int t)
{
if(t==n)//到达最后一层
{
for(int i=1; i<=m; i++)//遍历所有叶子节点
{
cw+=w[t][i];
cc+=c[t][i];
x[t]=i;
if(cc<=max_c&&cw<bestw)//若费用不超过最大费用并且重量小于之前的最优解
{
//更新最优解
bestw=cw;
for(int j=1; j<=n; j++)
bestx[j]=x[j];
}
cc-=c[t][i];//返回上一层
cw-=w[t][i];
x[t]=0;
}
}
else//未到达最后一层
{
for(int i=1; i<=m; i++)//遍历该层节点
{
x[t]=i;
cw+=w[t][i];
cc+=c[t][i];
if(cc<max_c&&cw<bestw)//费用小于最小费用重量小于最优解时进入下一层
{
BackTrack(t+1);
}
cc-=c[t][i];//返回上一层
cw-=w[t][i];
x[t]=0;
}
}
}
int main()
{
cout<<"输入部件数量 供应商个数 最大费用:"<<endl;
cin>>n>>m>>max_c;
cout<<"依次输入第i个部件第j个供应商所需要的费用:"<<endl;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>c[i][j];
}
}
cout<<"依次输入第i个部件第j个供应商所售部件的的重量:"<<endl;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>w[i][j];
}
}
BackTrack(1);
cout<<endl<<"最小重量为:"<<endl;
cout<<bestw<<endl;
cout<<"提供每个部件的供应商:"<<endl;
for(int i=1; i<=n; i++)
{
cout<<bestx[i]<<" ";
}
}
/*
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
*/
最小重量机器设计问题(回溯法)
最新推荐文章于 2024-05-19 14:56:07 发布