17085 工作分配问题

来源:互联网 发布:网络招生代理 编辑:程序博客网 时间:2024/05/21 14:45

 

17085 工作分配问题(必做)

时间限制:20000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: C++;C;VC;JAVA

Description

有n件工作分配给n个人,将工作i分配给第j个人需要支付劳务费用Cij。请为每人分配一个工作,并使得总劳务费用达到最小。
 
 
 

输入格式

第一行一个正整数n(1<=n<=11),表示n个工作数,接下来n行,每行代表第i个工作支付给n个不同的人的劳务费用。
 
 

输出格式

两行。第一行为最小的总劳务费用。第二行有n个数,表示工作分配方案。如下面sample用例的测试数据:第二行是2 1 3,表示第1个工作分配给第2个人,第2个工作分配给第1个人,第3个工作分配给第3个人。 2+2+5=9当同时有多种分配方案都能使得总劳务费用相同且都最小,小编号工作优先分配给小编号的人,仅输出这一种方案即可。
 
 

输入样例

310 2 32 3 43 4 5
 
 

输出样例

92 1 3

 

#include <iostream>

#include <stdio.h>

using namespace std;

int n;

int cost=0; //当前费用

int resC=100000;  //最小费用

int c[100][100];  //费用表

int m[100]={0};  // 分配表

int res[100];  //最终分配表

void dfs(int deep){

    if(deep>n-1){

            //cout <<cost;

        if(cost<resC) {  

//小编号工作优先分配给小编号的人 注意边界

                resC = cost;

                for(int i=0;i<n;i++) // 跟新最小分配

                    res[i]=m[i];

        }

    }else{

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

                if(m[i]==0){

 

          cost+=c[i][deep]; 

 //每行代表第i个工作支付给n个不同的人的劳务费用!!!!!!

          m[i] = deep+1;  // 记录分配的任务编号

          if(cost<resC)   //剪枝

          dfs(deep+1);

          cost-=c[i][deep];

          m[i] = 0;

                }

 

        }

 

    }

}

int main()

{

    freopen("in.txt","r",stdin);

    cin >>n;

    for(int i=0;i<n;i++)

        for(int j=0;j<n;j++)

        cin >> c[i][j];

    dfs(0);

    cout << resC << endl;

    //2 1 3,表示第1个工作分配给第2个人,第2个工作分配给第1个人,第3个工作分配给第3个人。

    for(int i=0;i<n;i++)

        cout << res[i] <<" ";

    return 0;

}

0 0
原创粉丝点击