Java教程

算法第五章实践报告

本文主要是介绍算法第五章实践报告,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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 
#include<iostream>
using namespace std;
 
int n,m,d,minweight=1000000,curvalue,curweight;
int w[101][101],c[101][101],x[101],bestx[101];
//w[i][j]表示从供应商j处购得的部件i的重量
//c[i][j]是对应的价格,d是限制的总价格 

void backtrack(int t){
    if(t>n){
        if(curweight<minweight){
            minweight=curweight;
            for(int j=1;j<=n;j++){
                bestx[j]=x[j]; //更新最优解所对应的供应商情况 
            }
        }
    }
    
    for(int j=1;j<=m;j++){ //注意列数j是供应商 
        if(curvalue+c[t][j]<=d&&curweight+w[t][j]<minweight){
        //保证最小重量&&总价格不超过d 
            curvalue=curvalue+c[t][j]; //更新状态 
            curweight=curweight+w[t][j];
            x[t]=j; //记录购买每个零件的供应商 
            backtrack(t+1);  //继续进行深度优先搜索 
            curvalue=curvalue-c[t][j]; //回溯 
            curweight=curweight-w[t][j];
        }
    }
}

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];
        }
    }
    backtrack(1);
    cout<<minweight<<endl;
    for(int i=1;i<=n;i++){
        cout<<bestx[i]<<" ";
    }
    return 0;
}

 

1.1 说明“最小重量机器设计问题"的解空间

(1,1,1)(1,1,2)(1,1,3)

(1,2,1)(1,2,2)(1,2,3)

(1,3,1)(1,3,2)(1,3,3)

(2,1,1)(2,1,2)(2,1,3)

(2,2,1)(2,2,2)(2,2,3)

(2,3,1)(2,3,2)(2,3,3)

(3,1,1)(3,1,2)(3,1,3)

(3,2,1)(3,2,2)(3,2,3)

(3,3,1)(3,3,2)(3,3,3)

1.2 说明 “最小重量机器设计问题"的解空间树

1.3 在遍历解空间树的过程中,每个结点的状态值是什么

当前的重量cw和价格cv

2. 你对回溯算法的理解

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 运用回溯法解题的关键要素有以下三点: (1) 针对给定的问题,定义问题的解空间; (2) 确定易于搜索的解空间结构; (3) 以深度优先方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
这篇关于算法第五章实践报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!