分配機器(基礎dp)

2021-09-27 09:28:49 字數 2663 閱讀 5930

題目描述:

某總公司擁有高效生產裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為總公司提供一定的盈利。問:如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。 分配原則:每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。其中m<=100,n<=100。

輸入:

第一行為兩個整數m,n。接下來是乙個n×m的矩陣,其中矩陣的第i行的第j列的數aij表明第i個公司分配j臺機器的盈利。所有資料之間用乙個空格分隔。

輸出:

只有乙個資料,為總公司分配這m臺裝置所獲得的最大盈利。

樣例輸入

3 21 2 3

2 3 4

樣例輸出

4

【分析】動態規劃基礎題型。

dp[i][j]表示前i+1個公司分配j+1臺機器時的最大盈利。(因為i,j下標從0開始)

d p[

i][j

]=ma

xk(d

p[i−

1][j

],dp

[i−1

][j−

k]+a

[i−1

][k−

1]

)dp[i][j]=max_k(dp[i-1][j],dp[i-1][j-k]+a[i-1][k-1])

dp[i][

j]=m

axk​

(dp[

i−1]

[j],

dp[i

−1][

j−k]

+a[i

−1][

k−1]

) (:a的下標從0開始的,dp的下標計算從1開始的;前面的和數dp[i-1][j]其實是後面k=0時的情況,就是第i個公司不分配機器的意思,因為後面a不會遍歷到這個情況,故在前面加上。)

def solution(a,m,n):

dp=[[0 for k in range(m+1)]for i in range(n+1)]

#dp_ij表示前i+1個公司分配j臺機器的最大盈利

for i in range(1,n+1):

for j in range(1,m+1):

dp[i][j]=max([dp[i-1][j]]+[dp[i-1][j-k]+a[i-1][k-1] for k in range(1,j+1)])

return dp[-1][-1]

s=map(int,raw_input().split(" ")) #m,n

a=for n in range(s[1]):

print(solution(a,s[0],s[1]))

#測試用例:

s=[15,10] #15臺機器,10個公司

a=[[ 36, 107, 184, 283, 286, 292, 361, 393, 425, 469, 475, 496, 577,656, 713],

[ 67, 68, 120, 136, 207, 279, 327, 413, 443, 521, 534, 542, 632,643, 719],

[ 86, 136, 223, 273, 315, 317, 363, 369, 455, 554, 570, 591, 657,670, 685],

[ 8, 105, 179, 217, 306, 332, 373, 387, 407, 478, 520, 547, 645,670, 685],

[ 82, 99, 198, 249, 291, 372, 453, 542, 561, 589, 603, 654, 700,730, 757],

[ 88, 104, 134, 140, 224, 227, 277, 302, 358, 440, 530, 587, 635,715, 770],

[ 1, 61, 113, 117, 209, 223, 286, 289, 336, 364, 405, 431, 527,573, 642],

[ 96, 176, 247, 312, 346, 375, 410, 419, 477, 572, 574, 587, 620,676, 744],

[ 75, 127, 225, 296, 370, 370, 463, 473, 491, 537, 602, 664, 680,721, 728],

[ 82, 133, 205, 205, 272, 295, 316, 393, 445, 512, 593, 637, 680,707, 745]]

#輸出:1167

def solution(a,m,n):

dp=[[0 for k in range(m+1)]for i in range(n+1)]

#dp_ij表示前i+1個公司分配j臺機器的最大盈利

for i in range(1,n+1):

for j in range(1,m+1):

dp[i][j]=max([dp[i-1][j]]+[dp[i-1][j-k]+a[i-1][k-1] for k in range(1,j+1)])

return dp[-1][-1]

print(solution(a,s[0],s[1]))

DP 機器分配

總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。第一行儲存兩個數,第乙個數是裝置台數m,...

機器分配 DP

題目 總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。輸入 第一行儲存兩個數,第乙個數是...

機器分配 dp

時間限制 1000 ms 記憶體限制 65536 kb 提交數 1693 通過數 867 總公司擁有高效裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權...