第五章上机实验报告

第五章上机实验报告

7-2 最小重量机器设计问题 (25 分)

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij​是从供应商j 处购得的部件i的重量,cij​是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。

输入格式:

第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行n个数。前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

一、问题分析

本题主要是为了求解购买n个部件的最少花费,因此课已利用解空间树的解决思路,通过对解空间树的遍历,记录下最少的花费和对应的供应商

二、代码

#include <iostream>

using namespace std;

int n,m,d;

int cc;

int cw;

int x[100];

int s[100];

int c[100][100];

int w[100][100];

int minW=999999;

 

void Backtrack(int t){

if(t>n){

if(cw<minW){

minW = cw;

for(int i=1;i<=n;i++){

s[i] = x[i];

}

}

}else{

for(int i=1;i<=m;i++){

x[t] = i;

cc += c[t][i];

cw += w[t][i];

if(cc<=d&&cw<minW){

Backtrack(t+1);

}

   cc -= 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];

}

}

cc = 0;  cw = 0;

Backtrack(1);

   cout<<minW<<endl;

for(int i=1;i<=n;i++){

cout<<s[i]<<" ";

}

return 0;

}

三、实验心得

本章主要学习了回溯算法,回溯算法关键之处在于要能画出解空间树,知道如何遍历解空间树来获得所要求的解,只有知道如何遍历解空间树才能在代码实现时携程准确的遍历条件,以及提高算法效率的剪枝和限界条件。

posted @ 2021-12-16 15:11  暖云  阅读(23)  评论(0编辑  收藏  举报