回顾下最小重量机器设计问题

最小重量机器设计问题:设某一机器由N个部件组成,每一个部件都可以从M个不同的供应商处购得。设wij是从供应商j处购得部件i的重量,cij是相应的价格。试设计一个算法,给出总价格不超过C的最小重量机器设计。

(用C++写,算法为回溯法,数据输入法为手工输入)

  1 #include<iostream>
  2 using namespace std;
  3 #define N 50
  4 class MinWmechine
  5 {
  6     int n; //部件个数
  7     int m; //供应商个数
  8     int COST; //题目中的C
  9     int cw; //当前的重量
 10     int cc; //当前花费
 11     int bestw; //当前最小重量
 12     int bestx[N];
 13     int savex[N];
 14     int w[N][N];
 15     int c[N][N];
 16 public:
 17     MinWmechine();
 18     void machine_plan(int i);
 19     void prinout();
 20 };
 21 MinWmechine::MinWmechine()
 22 { 
 23 cw=0; //当前的重量
 24 cc=0; //当前花费
 25 bestw=-1; //当前最小重量
 26 bestx[N];
 27 savex[N];
 28 cout<<"请输入部件个数:";
 29 cin>>n;
 30 cout<<"请输入供应商个数:";
 31 cin>>m;
 32 cout<<"请输入总价格不超过:";
 33 cin>>COST;
 34 for(int j=0;j<m;j++)
 35 {
 36    for(int i=0;i<n;i++)
 37    {
 38     cout<<"请输入第 "<<j+1<<" 个供应商的第 "<<i+1<<" 个部件的重量:";
 39     cin>>w[i][j];
 40     cout<<"请输入第 "<<j+1<<" 个供应商的第 "<<i+1<<" 个部件的价格:";
 41     cin>>c[i][j];
 42     if(w[i][j]<0 || c[i][j]<0)
 43     {
 44       cout<<"重量或价钱不能为负数!\n";
 45       i=i-1;
 46     }
 47    }
 48 }
 49 }
 50 void MinWmechine::machine_plan(int i)
 51 {
 52 if(i>=n)
 53 {
 54    if(cw <bestw || bestw==-1)
 55   {
 56     bestw=cw;
 57     for(int j=0;j<n; j++) //把当前搜过的路径记下来
 58      savex[j]=bestx[j];
 59    }
 60    return;
 61 }
 62 for(int j=0; j<m; j++) //依次递归尝试每个供应商
 63 {
 64    if(cc+c[i][j]<COST)
 65    {
 66     cc+=c[i][j];
 67     cw+=w[i][j];
 68     bestx[i]=j;
 69     machine_plan(i+1);
 70     bestx[i]=-1;
 71     cc-=c[i][j];
 72     cw-=w[i][j];
 73    }
 74 }
 75 }
 76 void MinWmechine::prinout()
 77 {
 78 int i,j,ccc=0;
 79 for(j=0;j<m;j++)
 80 {
 81    for(i=0;i<n;i++)
 82    {
 83     cout<<""<<j+1<<" 供应商的第 "<<i+1<<" 部件重量:"<<w[i][j]<<" 价格:"<<c[i][j]<<"\n";
 84    }
 85 }
 86 for(j=0; j<n; j++)
 87 {
 88    bestx[j]=-1;
 89 }         
 90 machine_plan(0);
 91 cout<<"\n最小重量机器的重量是: "<<bestw<<endl;
 92 for(int k=0; k<n; k++)
 93 {
 94    cout<<""<<k+1<<" 部件来自供应商 "<<savex[k]+1<<"\n";
 95    ccc+=c[k][savex[k]];
 96 }
 97 cout<<"\n该机器的总价钱是: "<<ccc<<endl;
 98 cout<<endl;
 99 }
100 int main(void)
101 {
102    MinWmechine Y;
103    Y.prinout();
104    return 0;
105 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值