【算法导论14】回溯法—运动员最佳配对问题

14回溯法—运动员最佳配对问题

问题描述:
羽毛球运动员男女各n人,给定两个n x n矩阵P、Q,P[i][j]是男i和女j组成的男运动员优势,Q[i][j]是女i和男j组成的女运动员优势,P[i][j]不一定等于Q[j][i],男i和女j组成的混合双打优势为P[i]][j]和Q[j][i],设计算法计算男女运动员最佳搭配法,使各组男女双方竞赛优势总和达到最大。

问题分析:
该问题输出为男女人员的搭配问题,由于运动员不能重复选择,因此此问题的解空间树是一个排列树,可以使用排列树回溯法模板进行算法设计。
下面考虑剪枝函数,因为当人员没有选完时,不确定最终结果是否优于最优解,所以回溯过程中不需要剪枝函数进行剪枝,只有当一条分支运行到叶子结点时,才需要判断可行解于最优解的关系,考虑是否更新最优解。
最后考虑输出结果,输出结果应该时是包含运动员编号的集合,用x[i]表示,原数组存放初始编号,经过算法处理后,输出符合最优值的编号。

算法设计:

#define n 10
int p[n + 1][n + 1], q[n + 1][n + 1];
int max, temp=0;
int r[n + 1];
void ball(int i) {
	if (i > n) {
		if (temp > max) {
			max = temp;
			for (int i = 1; i <= n; i++)
				printf("%d", r[i]);
		}
	}
	for (int j = i; j <= n; j++) {
		swap(r[i], r[j]);
		temp += p[j][r[j]] * q[r[j]][j];
		ball(i + 1);
		temp -= p[j][r[j]] * q[r[j]][j];
		swap(r[i], r[j]);
	}
}
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值