洛谷地址: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; }