标签:int 供应商 部件 第五章 回溯 100 实验报告 重量
1. 请用回溯法的方法分析“最小重量机器设计问题”
题目:
7-2 最小重量机器设计问题 (25 分)
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
输入格式:
第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行m个数。前n行是c,后n行是w。
输出格式:
输出计算出的最小重量,以及每个部件的供应商
输入样例:
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
结尾无空行
输出样例:
在这里给出相应的输出。例如:
4
1 3 1
代码:
#include <iostream> using namespace std; int n,m,d; //部件数量,供应商,最高总额 int c[100][100]; //价值 int w[100][100]; //重量 int cv,cw;// 当前价值,当前重量 int x[100]; int supplier[100];//所选供应商 int min_m=10000; void Backtrack(int t){ if(t>n){ if(cw<min_m){ min_m=cw; for(int i=1;i<=n;i++){ supplier[i]=x[i]; } } } else{ for(int i=1;i<=m;i++){ x[t]=i; cv+=c[t][i]; cw+=w[t][i]; if(cv<=d&&cw<min_m){ Backtrack(t+1); } cv-=c[t][i]; cw-=w[t][i]; } } } int main(){ cin>>n>>m>>d; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>c[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>w[i][j]; } } cw=0; cv=0; Backtrack(1); cout<<min_m<<endl; for(int i=1;i<=n;i++){ cout<<supplier[i]<<" "; } }
1.1 说明“最小重量机器设计问题"的解空间
答:由于每一种部件都可以从m个不同的供应商处购得,所以解空间是每个部件选择的不同供应商
1.2 说明 “最小重量机器设计问题"的解空间树
答:若根节点为第0层,树的第一层为第一个部件所选择的供应商,树的第i层为第i个部件所选择的供应商,
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
答: ① 当前重量:价值不超过规定值的条件下,当前所选部件的总重量
② 当前价值:价值不超过规定值的条件下,当前所有所选部件的总价值
2. 你对回溯算法的理解
答:应用回溯算法的步骤:
1.构造解空间树:子集树和排列树;
2.以深度优先的方式搜索解空间:递归或迭代;
3.设计剪枝函数避免无效搜索:使用约束函数,剪去不满足约束条件的路径或使用限界函数,剪去不能得到最优解的路径。
在任何时候,只需保存从根节点到当前扩展结点的路径。
在回溯问题中,若要求问题的所有解,就要回溯到根。
标签:int,供应商,部件,第五章,回溯,100,实验报告,重量 来源: https://www.cnblogs.com/sohandsomeman/p/15690212.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。