设有A、B、C、D、E五人从事J1、J2、J3、J4、J5五项工作,每人只能从事一项……

例5.6 设有A、B、C、D、E五人从事J1、J2、J3、J4、J5五项工作,每人只能从事一项,他们的效益如图下图所示。

J1J2J3J4J5
A13111047
B13101085
C59774
D151210115
E1011884

每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的一种组合输出。

【算法分析】

1.用数组f存储搜索中工作选择的方案;使用key存储最优解;数组p用于表示某项工作有没有被选择了。

2.(1)选择p(i)=0的第i项工作;

(2)判断效益是否高于max已记录的效益,若高于则更新max的值。

3.搜索策略:回溯法(深度优先搜索dfs)

【参考程序】

//每人选择五项工作中的一项,在各种选择的组合中,
//找到效益最高的一种组合输出。

#include <bits/stdc++.h>
using namespace std;
//1.初始化变量
int a[6]={0,13,11,10,4,7};
int b[6]={0,13,10,10,8,5};
int c[6]={0,5,9,7,7,4};
int d[6]={0,15,12,10,11,5};
int e[6]={0,10,11,8,8,4};
int tot=1;//记录方案数量
int maxn=0;
int key;//记录最大效益方案
bool p[6];
int f[10001][6];//保存每种方案
void search(int );//声明深搜函数
void solve();
int main(){
	search(1);//从第一个人开始搜索
	for(int i=1;i<=5;i++){
		//输出每个人对应的工作
		cout<<char(64+i)<<":J"<<f[key][i]<<endl;
	}
	//输出最大效益maxn
	cout<<maxn<<endl;
	return 0;
}
void search(int t){
	//定义深搜函数
	for(int i=1;i<=5;i++){
		//共五种工作
		if(!p[i]){
			//当前工作没有被选中
			f[tot][t]=i;//存储当前选择
			p[i]=1;
			if(t==5){
				//到达搜索终点
				solve();//设置解决函数
			}else{
				search(t+1);//没有到达终点需要继续搜索
			}
			p[i]=0;//回溯
		}
	}
}
void solve(){
	//试着输出每一种方案
	//出现0的情况,先去0;
	int k=1;
	while(!f[tot][k]){
		f[tot][k]=f[tot-1][k];
		k++;
	}
	//去0成功,方案已经实现
	//计算总效益,与maxn比较
	int sum=a[f[tot][1]]+b[f[tot][2]]+c[f[tot][3]]+d[f[tot][4]]+e[f[tot][5]];
	if(maxn<sum){
		maxn=sum;//记录最大效益
		key=tot;//记录最大效益方案
	}
	tot++;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小芒果_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值