问题标题: 酷町堂:4050 分配工作

0
0
已解决
许金夫
许金夫
初级天翼
初级天翼

这道题我就一个问题:为什么我都用了used数组,却依然重复:

1048   工作分配问题
经验值:1600
题目描述 Description
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij。试设计一个算法,为每一个人都分配一件不同的工作,并使总费用达到最小。

设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。


  
输入描述 Input Description
第一行有1个正整数n (1≤n≤20)。接下来的n行,每行n个数,第i行表示第i个人各项工作费用。


 
输出描述 Output Description
计算出的最小总费


 
样例输入 Sample Input
3
4  2  5
2  3  6
3  4  5
样例输出 Sample Output
9

我的代码:

#include <iostream>
#include <cmath>
using namespace std;
int used[25], mn = 0, n, cost[25][25];
int pay[25],pay1[25];
void dfs(int t, int c) {//给第t个人分配工作,当前的总花费c 
    if(c < mn) return ;
    //代码1和代码2的区别在于这里,加上了剪枝,如果某个解法的花费已经比当前的最小花费的解法更加多了,那么这个解法就没有必要再继续搜索下去了。
    if(t==n+1) {
    	if(mn<c){
    		for(int i=1;i<=5;i++){
	        	pay1[i]=pay[i];
			}
		}
        mn = max(mn, c);
        return ;
    } 
    for(int j=1; j<=n; j++) {
        if(used[j]==0) {
            used[j] = 1;
            pay[t]=n;
            dfs(t+1, c+cost[t][j]);
            used[j] = 0;
            pay[t]=0;
        } 
    } 
}
int main() {
    n=5;
    for(int i=1; i<=n; i++) 
        for(int j=1; j<=n; j++) 
            cin >> cost[i][j];//第i个人完成第j件工作的花费
    dfs(1, 0); 
    for(int i=1;i<=5;i++){
    	cout<<pay1[i]-1<<" ";
	}
    cout << endl << mn;
    return 0;
}

求解!!!

许金夫在2020-05-15 21:58:34追加了内容

额,发错了

就是4050@董子墨

4050   分配工作
经验值:800
题目描述 Description
设有A,B,C,D,E五个人从事J1,J2,J3,J4,J5五项工作,每个人只能从事一项工作,现输入一个5*5的二维数组,第一行表示A分别从事J1到J5的效益,第二行表示B分别从事J1到J5的效益,依此类推…将5项工作分配给5个人,每个人只能接受一项工作,每一项工作也只能分配给一个人,问如何分配效益最高,输出


  
输入描述 Input Description
输入5*5的二维数组,第一行表示A分别从事J1到J5的效益,第二行表示B分别从事J1到J5的效益,依此类推…


 
输出描述 Output Description
输出为两行,第一行为五个数,分别代表A,B,C,D,E分别从事第几项工作(第一项工作输出0,第二项工作输出1…第五项工作输出4)

第二行输出最高的总效益


 
样例输入 Sample Input
13 11 10 4 7
13 10 10 8 5
5 9 7 7 4
15 12 10 11 5
10 11 8 8 4
样例输出 Sample Output
4 2 3 0 1
50

 

许金夫在2020-05-16 16:03:26追加了内容

已AC,准备结贴了


0
已采纳
董子墨
董子墨
中级天翼
中级天翼

你到底是问那一题?

0
0
0
0
我要回答