日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通(1266:【例9.10】机器分配)

發布時間:2025/3/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通(1266:【例9.10】机器分配) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1266:【例9.10】機器分配


時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 6867 ??? 通過數: 3370

【題目描述】

總公司擁有高效設備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臺

【分析】

? ? ? ? 按照公司的順序來分配機器,即按照公司的順序劃分階段,第一個階段把 m 臺設備分給第一個公司,記錄下來獲得的各個盈利值,然后把 m 臺設備分給前兩個公司,和第一個階段比較記錄下來更優的各個盈利值,一直到第 n 個階段把 m臺機器全部分給了n個公司,就可以得到最優解,下面來討論兩個階段之間的關系,設數組 f[i][j]表示前 i 個公司分配?j 臺機器的最大盈利,數組 f[i-1][k]表示前 i-1 個公司分配 K 臺機器的最大盈利(1<=i<=n,1<=j<=m,0<=k<=j),用value[i][j]表示第 i 個公司分配 j 臺機器的盈利,則 f[i][j]可以由下面的式子中取最大值獲得∶
? ? ? ? f[i-1][0]+value[i][j]? ? ? ?//前 i-1 公司分配 0 臺機器最大盈利+第 1 個公司分配 j 臺的機器的盈利

? ? ? ? f[i-1][1]+value[i][j-1]? ? //前 i-1 公司分配 1 臺機器最大盈利+第 1 個公司分配 j-1?臺的機器的盈利

? ? ? ? f[i-1][2]+value[1][j-2]? ?//前 i-1 公司分配 2 臺機器最大盈利+第 1 個公司分配 j-2 臺的機器的盈利

? ? ? ? f[i-1][j-1]+value[i][1]? ? //前 i-1 公司 j-1 分配臺機器最大盈利+第 1 個公司分配 1 臺的機器的盈利

? ? ? ? f[i-1][j]+value[i][0]? ? ? //前 i-1 公司分配 j 臺機器最大盈利+第 1 個公司分配 0 臺的機器的盈利
? ? ? ? 在這里用機器數用做每個階段的狀態,由于 value[1][j]的值為定值,要使前面每個式子的值最大,就必須使第 i-1 階段的各個狀態的值最大,階段 i 的狀態只能由階段 i-1 中的狀態通過狀態轉移方程求得,與其他狀態沒有關系。由此可見,該問題具備了最優子結構和無后效性原則,適宜使用動態程序設計方法求解。

狀態轉移方程為∶f[i][j]= max { f[i-1][K] + value[i][j-k] }? (1<=i<=n,1<=j<=m, 0<=k<=j)
初始值∶f[0][0]=0,f[n][m]的值即為所求最大盈利值。

【參考代碼】

#include <stdio.h> int max1; int f[11][20],value[11][20]; int show(int i,int j) {int k;if(i==0)return 0;for(k=0;k<=j;k++){if(max1==f[i-1][k]+value[i][j-k]) // 遞歸求各公司分配的機器數量 {max1=f[i-1][k];show(i-1,k);printf("%d %d\n",i,j-k);break;}} } int main() {int m,n,i,j,k;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&value[i][j]);for(i=1;i<=n;i++)for(j=1;j<=m;j++){max1=0;for(k=0;k<=j;k++){if(f[i-1][k]+value[i][j-k]>max1)max1=f[i-1][k]+value[i][j-k];}f[i][j]=max1;}printf("%d\n",f[n][m]); // 輸出最大盈利值 show(n,m); // 輸出分配情況 return 0; }

http://ybt.ssoier.cn:8088/problem_show.php?pid=1266

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的信息学奥赛一本通(1266:【例9.10】机器分配)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。