• 洛谷P2066 机器分配(dfs做法)


    洛谷地址:https://www.luogu.com.cn/problem/P2066

    题目描述

    总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。

    输入格式

    第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。

    接下来是一个N*M的矩阵,表明了第 I个公司分配 J台机器的盈利。

    输出格式

    第1行为最大盈利值

    第2到第n为第i分公司分x台

    P.S.要求答案的字典序最小

    解析:

    这题正解其实是区间DP,但看到有人DFS A掉了,就拿来练练dfs吧

    字典序没有问题,因为更新答案时就是从1号公司开始改的。

    具体看注释吧

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=2e3+10;
    const int maxn2=20;
    int mp[maxn][maxn];
    int answ[maxn];  //最终答案
    int md[maxn];  //假设i号公司使用了md[i]台机器
    int n,m;
    int ans=0;
    int dfs(int id,int have, int sh)//id为当前公司id,have为当前获利,sh为所剩的机器数
    {
        if(sh<0)
            return 0;
        if(id==n+1)
        {
            if(have>ans)  //最大值更新
            {
                ans=have;
                for(int i=1;i<=n;i++)
                    answ[i]=md[i];
            }
            return 0;
        }
        for(int i=0;i<=m;i++)
        {
            md[id]=i;
            dfs(id+1,have+mp[id][i],sh-i);//到下一个公司
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&mp[i][j]);
        dfs(1,0,m);
        cout<<ans<<endl;
        for(int i=1;i<=n;i++)
            cout<<i<<" "<<answ[i]<<endl;
    }
  • 相关阅读:
    最长不下降子序列 从O(n)到O(nlogn)
    【NOIP1999】【洛谷P1020】导弹拦截
    【NOI2001】【洛谷P2024】食物链
    【2017中国大学生程序设计竞赛
    【2017中国大学生程序设计竞赛
    【NOIP】【洛谷P1029】最大公约数和最小公倍数问题
    【NOIP2009】【洛谷P1072】Hankson 的趣味题
    C++模板(2)
    Java中跳出循环的方法
    localeCompare() 方法实现中文的拼音排序
  • 原文地址:https://www.cnblogs.com/liyexin/p/13524833.html
Copyright © 2020-2023  润新知