洛谷P2066 機器分配(dfs做法)
阿新 • • 發佈:2020-08-18
洛谷地址: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; }