zoukankan      html  css  js  c++  java
  • 算法第五章上机实践报告

    1. 实践题目

    工作分配问题

    2. 问题描述

    设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

    输入格式:

    输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。

    输出格式:

    将计算出的最小总费用输出到屏幕。

    输入样例:

    在这里给出一组输入。例如:

    3
    10 2 3
    2 3 4
    3 4 5
    

    输出样例:

    在这里给出相应的输出。例如:

      9

    3. 算法描述

    解空间:{1,2,······,n} ,第一个元素为第一个工作,元素内容对应为第几个人

    解空间树:排列树

    剪枝函数:在访问某结点前先进行判断 if (cc+a[i][x[j]]<bestc),从而进行剪纸

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int n;//work
     5 int bestc;//最优费用
     6 int cc=0;//当前费用
     7 int x[1000];//当前解
     8 int a[21][21];//对应工作费用
     9 
    10 void Backtrack(int i){//第i个工作分配 
    11     if (i>n){
    12         if(cc<bestc)    bestc=cc;
    13     }
    14     else{
    15         for(int j=i;j<=n;j++){//分配给第j个人 
    16             if (cc+a[i][x[j]]<bestc)
    17             {
    18             cc+=a[i][x[j]];            
    19             swap(x[i],x[j]);
    20             Backtrack(i+1);
    21             swap(x[i],x[j]);
    22             cc-=a[i][x[j]];
    23             }
    24         }
    25     }        
    26 } 
    27 
    28 int main(){
    29     cin>>n;
    30     for(int i=1;i<=n;i++){
    31       for(int j=1;j<=n;j++){
    32           cin>>a[i][j];
    33         bestc+=a[i][j];
    34       }     
    35     }
    36     for(int i=1 ;i<=n;i++)//对x数组进行顺序初始化
    37       x[i] = i;
    38     Backtrack(1);
    39     cout<<bestc<<endl;
    40     return 0;     
    41 }

    4. 心得体会

    写代码时先确定解空间树是排列树,然后套用排列树的模板,再考虑限定条件,当当前费用加下一个结点对应费用大于当前最优费用时就进行剪枝,按照这个思路去做,虽然过程中也遇到一些细节问题,但还是很顺利的ac了



  • 相关阅读:
    关于点击率模型,你知道这三点就够了
    【AI】Computing Machinery and Intelligence
    MATLAB 的函数句柄
    MATLAB 的unique函数——数组矩阵的唯一值
    MATLAB 的数据导入与导出
    MATLAB 的函数
    MATLAB 向量
    MATLAB 的break语句和continue语句
    MATLAB 的循环语句
    MATLAB 的条件分支语句
  • 原文地址:https://www.cnblogs.com/xjsunshine/p/10164363.html
Copyright © 2011-2022 走看看