社区讨论

站外题,求调玄关

灌水区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m676x78j
此快照首次捕获于
2025/01/22 08:53
去年
此快照最后确认于
2025/11/04 11:04
4 个月前
查看原帖
题目:
描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为Cij。试设计一个算法,为每一个人都分配一件不同的工作,并使总费用达到最小。
输入
第一行有一个正整数n(1<=n<=20)。接下来的n行,每行有n个数,第i行表示第i个人各项工作费用。
输出
输出计算出的最小总费用。
输入格式 无
输出格式 无
输入/输出例子1 输入:
3
4 2 5
2 3 6
3 4 5
输出:
9
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[25][25],b[25],c[25],zx=0x3f3f3f3f3f,sum;
void dfs(int t) {
  if (t==n) {
    sum=0;
    for (int i=1;i<=n;i++)
      sum+=a[i][c[i]];
    zx=min(zx,sum);
    return;
  }
  for (int i=1;i<=n;i++)
    if (b[i]==0) {
      b[i]=1,c[t+1]=i;
      dfs(t+1);
      b[i]=0;
    }
}
signed main() {
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
      for (int j=1;j<=n;j++)
        scanf("%d",&a[i][j]);
    dfs(0);
    printf("%d",zx);
    return 0;
}
两个点超时,想不明白你<=20怎么超

回复

2 条回复,欢迎继续交流。

正在加载回复...