算法第五章作业
设某一机器由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;
}