• 从事效应


     【题目】

    设有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

     

     

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

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

  • 相关阅读:
    MessageBoxButtons.OKCancel的选择事件
    Markdown 学习
    【Python】tesserocr的Path错误
    【Python套接字】socket编程
    【Python数据】懒人修仙传数值
    【Python画画】失败案例总结
    【Python画画】.ui文件转.py文件
    【Python截图】截图处理
    【想法】想做一个辅助工具
    【Python爬虫】从html里爬取中国大学排名
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6607307.html
Copyright © 2020-2023  润新知