【例9.10】機器分配
阿新 • • 發佈:2017-10-06
return problem 二分 name php spa 內存 ios 超過
時間限制: 1000 ms 內存限制: 65536 KB
【例9.10】機器分配
鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1266
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
總公司擁有高效設備M臺,準備分給下屬的N個分公司。各分公司若獲得這些設備,可以為國家提供一定的盈利。問:如何分配這M臺設備才能使國家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原則:每個公司有權獲得任意數目的設備,但總臺數不超過設備數M。
【輸入】
第一行有兩個數,第一個數是分公司數N,第二個數是設備臺數M;
接下來是一個N*M的矩陣,表明了第 I個公司分配 J臺機器的盈利。
【輸出】
第一行輸出最大盈利值;
接下N行,每行有2個數,即分公司編號和該分公司獲得設備臺數。
【輸入樣例】
3 3 //3個分公司分3臺機器 30 40 50 20 30 50 20 25 30
【輸出樣例】
70 //最大盈利值為70 1 1 //第一分公司分1臺 2 1 //第二分公司分1臺 3 1 //第三分公司分1臺
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int v[15][25],f[15][25],a[15]; const int maxn=10000005; int show(int n,int m) { if(!n)return 0; for(int k=0;k<=m;k++) if(f[n-1][k]+v[n][m-k]==f[n][m]) { show(n-1,k); cout<<n<<""<<m-k<<endl; break; } } int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>v[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { for(int k=0;k<=j;k++) if(f[i-1][k]+v[i][j-k]>f[i][j]) f[i][j]=f[i-1][k]+v[i][j-k]; } cout<<f[n][m]<<endl; show(n,m); }
【例9.10】機器分配