1. 程式人生 > 實用技巧 >洛谷P2066 機器分配(dfs做法)

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