算法第五章作业

算法第五章作业

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

1. 请用回溯法的方法分析“最小重量机器设计问题”

不同层次代表着不同的部件,如第一个部件为层次1,不同的供应商为同一层次中不同的节点,用变量bestW记录最小重量,在回溯函数前写出状态转移方程,并在回溯后进行复原,在递归中遍历整棵树的状态但不必存储,只记录最优解。

 

1.1 说明“最小重量机器设计问题"的解空间

(w11,w21,w31,w41)…………

(w12,w21,w31,w41)…………

…………………………………………

1.2 说明 “最小重量机器设计问题"的解空间树

 

 

 

 

1.3 在遍历解空间树的过程中,每个结点的状态值是什么

当前总重量cw与当前总价格cp, 。

2. 你对回溯算法的理解

在回溯函数前写出状态转移方程,并在回溯后进行复原在不同层次的不同节点更新状态,以此遍历整棵树。

 

 



#include<bits/stdc++.h>
using namespace std;
int n,m,d;
int array1[100][100];//cij
int array2[100][100];//wij
int cw=0;
int cp=0;
int bestw=1000000;
int x[100];//记录所选部门
int x1[100];
void machine(int t){
  if(t>=n){
      if(cw<bestw){
          bestw=cw;
          for(int i=0;i<n;i++){
              x1[i]=x[i];
          }
      }
      return;
  }
  for(int i=0;i<m;i++){
      cp+=array1[t][i];
      cw+=array2[t][i];
      x[t]=i;
    if(cp<=d && cw <=bestw){
      machine(t+1);
    }
    cp-=array1[t][i];
    cw-=array2[t][i];
  }
}
int main()
{

•   cin >> n >> m >> d;
•   memset(x1,0,sizeof(x1));
•   memset(x,0,sizeof(x));
•   memset(array1,0,sizeof(array1));
•   memset(array2,0,sizeof(array2));
•   for(int i=0;i<n;i++){
•       for(int j=0;j<m;j++){
•           cin >> array1[i][j];
•       }
•   }
•     for(int i=0;i<n;i++){
•       for(int j=0;j<m;j++){
•           cin >> array2[i][j];
•       }
•   }
•   machine(0);
•   cout << bestw << endl;
•     for(int i=0;i<n;i++){
•       cout << x1[i]+1 << " ";
•     }
•   return 0;

}

 

posted @ 2021-12-14 23:30  半个一加冰  阅读(42)  评论(0编辑  收藏  举报