算法第五章上机实践报告
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; const int N = 100; int n,m,d; int c[N][N]; int w[N][N]; int ans[N];//记录最优选择 int res = 1e9;//记录最小重量 int wei;//记录重量 int cost;//记录价值 int cnt[N];//记录选择 //价格不超过d,最小重量 void dfs(int row) { if(row > n) { if(res > wei){ for(int i = 1; i <= n; i++) ans[i] = cnt[i]; res = wei; } return; } //cout << "flag" << endl; for(int i = 1; i <= m; i++) { wei += w[row][i]; cost += c[row][i]; cnt[row] = i; if(cost <= d && wei <= res) dfs(row + 1); wei -= w[row][i]; cost -= c[row][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]; dfs(1); cout << res << endl; for(int i = 1; i <= n; i++) { cout << ans[i] << " "; } return 0; }
解空间:
n 个部件,m 个供应商
长度为 n 的向量
每个部件都有 m 种情况,n 的 m 次方个向量
解空间树:
除叶子节点外每个节点都有 m 个子节点,共有 n 层
每个结点的状态值:
加入当前节点后的总重量、价值,当前最优答案、以及所选择的路径。
对回溯算法的理解:
顾名思义,处理完当前这一方向的事件后再返回来去处理原来没有处理过的事件。