题目描述:
设有 n 件工作分配给 n 个人。将工作 i 分配给第 j 个人所需的费用为 Cij 。试设计一个算法,为每一个人都分配一件不同的工作,并使总费用达到最小。
设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。
输入格式:
第一行有 1 个正整数 n(1≤n≤20) 。接下来的 n 行,每行 n 个数,第 i 行表示第 i 个人各项工作费用。
输出格式:
计算出的最小总费用
样例输入:
3 4 2 5 2 3 6 3 4 5
样例输出:
9
提示:
要剪枝优化
时间限制: 1000ms
空间限制: 128MB
替你们试过了,纯暴力80分TLE,剪枝后直接将时间压缩到10ms以内
代码实现:
#include<bits/stdc++.h>
using namespace std;
int a[1001][1001],sum,n,ans=10e6,vis[101];
void dfs(int t,int sum){
if(t>n){
ans=min(sum,ans);
return;
}
if(sum>ans)return;//剪枝
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
dfs(t+1,sum+a[t][i]);
vis[i]=0;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cin>>a[i][j];
}
dfs(1,0);
cout<<ans;
return 0;
}