社区讨论
站外题,求调玄关
灌水区参与者 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 条回复,欢迎继续交流。
正在加载回复...