1. 程式人生 > >【例9.10】機器分配

【例9.10】機器分配

return problem 二分 name php spa 內存 ios 超過

【例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】機器分配