问题描述:
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入格式:
输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
输出格式:
将计算出的最小总费用输出到屏幕。
输入样例:
在这里给出一组输入。例如:
3
10 2 3
2 3 4
3 4 5
结尾无空行
输出样例:
在这里给出相应的输出。例如:
9
连接:PTA最后一个测试点过不了,大佬帮我看看哪里错了呜呜呜-优快云社区
我的回复:
#include <stdio.h>
#define MaxWorks 100
int main() {
int works; // 工作数量
int feeList[MaxWorks][MaxWorks]; // 费用列表
int workers[MaxWorks]; // 工人的标记
int jobs[MaxWorks]; // 工作的标记
int maxFee = 0; // 最大费用
int totalMinFee = 0; // 最小费用合计
printf("请输入工作数量:");
scanf("%d", &works);
if (works <= 0 || works > MaxWorks) {
printf("输入的工作数量无效!\n");
return 1;
}
for (int i = 0; i < works; i++) {
for (int j = 0; j < works; j++) {
printf("请输入第%d行,第%d列个工作的费用:", i, j);
scanf("%d", &feeList[i][j]);
maxFee += feeList[i][j]; // 累计所有工作费用作为最小工作费用的初始值
}
workers[i] = 0; // 初始化工人的标记
jobs[i] = 0; // 初始化工作的标记
}
for (int k = 0; k < works; k++) {
int minFee = maxFee; // 最小费用
int workerTag; // 已分配的工人标记
int JobTag; // 已分配的工作标记
for (int i = 0; i < works; i++) {
if (workers[i] != 0) { // 此工人已有工作,跳过它
continue;
}
for (int j = 0; j < works; j++) {
if (jobs[j] == 0 && feeList[i][j] < minFee) { // 此工人收取的最小费用是最低的
minFee = feeList[i][j];
workerTag = i;
JobTag = j;
}
}
}
totalMinFee += minFee;
workers[workerTag] = 1;
jobs[JobTag] = 1;
printf("k = %d, workerTag = %d, JobTag = %d, minFee = %d\n", k, workerTag, JobTag, minFee);
}
printf("最小的工作费用:%d\n", totalMinFee);
return 0;
}