zoukankan      html  css  js  c++  java
  • C

    Description

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

    Input

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

    Output

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

    Sample

    Input

    3
    10 2 3
    2 3 4
    3 4 5

    Output

    9

    题解:

    这个题目跟前面运动员最佳搭配问题相似,不过这道题是找最小值。
    依旧是“剪枝”问题,如果当前累加的使用费用已经超过了已经找到的最小的费用,剪枝,结束递归。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #define maxn 25
    
    using namespace std;
    
    /**
    *INF 无穷大
    */
    int INF = 0x3f3f3f3f;
    /**
    *s记录工人和工作搭配的花费
    *f记录当前工人是否已经分配工作
    *sum当前累加的费用
    *n输入数据大小
    *MIN最小费用
    */
    int s[maxn][maxn], f[maxn], sum, n, MIN;
    
    /**
    *i已经分配到第几件事情。
    */
    void dfs(int i){
        int j;
        //事件分配完毕,结束递归。
        if(i == n){
            if(sum < MIN){
                MIN = sum;
            }
            return;
        }
        //整明已经不可能成为最小值,剪枝。结束递归。
        if(sum >= MIN)
            return;
        for(j=0; j<n; j++){
            if(!f[j]){
                sum += s[i][j];
                f[j] = 1;
                dfs(i + 1);
                //回溯
                sum -= s[i][j];
                f[j] = 0;
            }
        }
    }
    
    int main(){
        int i, j;
        scanf("%d",&n);
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                scanf("%d",&s[i][j]);
            }
        }
        sum = 0;
        MIN = INF;
        dfs(0);
        printf("%d
    ",MIN);
        return 0;
    }
    
    
  • 相关阅读:
    Security+考试通过心得
    Splunk Power User认证
    Splunk笔记
    关于工作
    智能合约安全-parity多重签名钱包安全漏洞
    kickstart构建Live CD 添加文件问题
    Local Authentication Using Challenge Response with Yubikey for CentOS 7
    计算Linux权限掩码umask值
    IntelliJ IDEA 常用快捷键
    关于常量池-----小例子
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/13854156.html
Copyright © 2011-2022 走看看