第五章实验报告
第五章实验报告
题目:最小重量机器设计问题
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
输入格式:
第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行n个数。前n行是c,后n行是w。
输出格式:
输出计算出的最小重量,以及每个部件的供应商
#include <stdio.h> using namespace std; const int N = 30; const int Max = 0x3f3f3f3f; int n,m,d,c[N][N],w[N][N],answ,noww,nowc,now[N],ans[N]; void backtrack(int t) { if(t>n) { if(answ>noww) { answ=noww; for(int i=1;i<=n;i++) ans[i]=now[i]; } return; } for(int i=1;i<=m;i++) { if(noww+w[t][i]<answ&&nowc+c[t][i]<=d) { noww+=w[t][i]; nowc+=c[t][i]; now[t]=i; backtrack(t+1); noww-=w[t][i]; nowc-=c[t][i]; } } } int main() { scanf("%d %d %d", &n, &m, &d); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d", &c[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d", &w[i][j]); answ=Max; backtrack(1); printf("%d\n", answ); for(int i=1;i<=n;i++) printf("%d ", ans[i]); return 0; }
1. 请用回溯法的方法分析“最小重量机器设计问题”
根据题意,每种部件都需要购买,但不同商家卖的部件价格与重量都不同,所以考虑使用回溯法,通过DFS来一次次选取不同的方案以找到最优方案。
1.1 说明“最小重量机器设计问题"的解空间
该题的解空间是所有满足小于给定价格并选上所有种类的部件的集合。
1.2 说明 “最小重量机器设计问题"的解空间树
该题的解空间树是棵n层m^m的树。
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
每个结点的状态应该是当前存放的重量和开销。
2. 你对回溯算法的理解
回溯法能直观地反映问题的求解步骤,不遗漏每一种可能。