算法第五章实验笔记
算法第五章实验笔记
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
1. 请用回溯法的方法分析“最小重量机器设计问题”
每一个部件为一个层次,选用不同的供应商为不同的兄弟节点,使用回溯法列出解空间树,以此递归遍历,将所有的可能列出来,并加入总价格不超过d为限制函数,如果某一结点重量M<minM,则更新minM。
1.1 说明“最小重量机器设计问题"的解空间
1.2 说明 “最小重量机器设计问题"的解空间树
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
当前重量cw,当前价格cp, cp<d
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;
}