从事效应

 【题目】

设有ABCDE五人从事J1J2J3J4J5五项工作,每人只能从事一项,他们的效益如下。
 
每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。

【算法分析】

    ⒈用数组f储存工作选择的方案;数组g存放最优的工作选择方案;数组p用于表示某项工作有没有被选择了。
    ⒉(1)选择p(i)=0的第i项工作;
       (2)判断效益是否高于max已记录的效益,若高于则更新g数组及max的值。
    ⒊搜索策略: 回溯法(深度优先搜索dfs)。

 【代码】 

#include<iostream>
#include<cstdio>
using namespace std;

int data[6][6]= {
    {0, 0, 0, 0, 0,0},
    {0,13,11,10, 4,7},
    {0,13,10,10, 8,5},
    {0, 5, 9, 7, 7,4},
    {0,15,12,10,11,5},
    {0,10,11, 8, 8,4}
};
int f[52]; //数组f储存工作选择的方案
int g[52]; //数组g存放最优的工作选择方案
bool p[6]= {0}; //数组p用于表示某项工作有没有被选择
int maxx=0;
int search(int,int);

int main() {
    search(1,0);
    for (int i=1; i<=5; i++)
        cout<<char(64+i)<<":J"<<g[i]<<" "; //输出各项工作安排情况
    cout<<endl;
    cout<<"max="<<maxx<<endl;
    return 0;
}

int search(int r,int t) { //r为第几个人
    for (int i=1; i<=5; i++)
        if (!p[i]) { //判断第i项工作没人选择
            f[r]=i; //第r个人,就选第i项工作
            p[i]=1; //标记第i项工作被人安排了
            t+=data[r][i]; //计算效益值
            if (r<5) search(r+1,t);
            else if (t>maxx) { //保存最佳效益值
                maxx=t;
                for (int j=1; j<=5; j++)
                    g[j]=f[j]; //保存最优效益下的工作选择方案
            }
            t-=data[r][i]; //回溯
            p[i]=0;
        }
}
View Code

 

 

如果运气好也是错,那我倒愿意错上加错!

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6607307.html