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


    最小重量机器设计问题:设某一机器由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 }
  • 相关阅读:
    .Uva&LA部分题目代码
    历史遗留问题列表
    hdu5681 zxa and wifi
    算法心得2:关于k个最小和问题的思考
    算法心得1:由$nlogn$复杂度的LIS算法引起的思考
    Codeforces Round #336 Marbles
    HDU 2571 命运
    POJ 3630 && HDU 1671 Phone list(静态字典树)
    静态字典树和动态字典树模板
    双向广搜
  • 原文地址:https://www.cnblogs.com/sxzheng/p/3070585.html
Copyright © 2020-2023  润新知