> description
有n家公司來分配m臺機械,給出每一家公司用1~m臺機械分別可以做出的盈利,求出用m臺機械可以獲得的最大盈利。(可以有的分公司沒有分到機械)。
> input
第一行輸入機械數m,公司數n。
接下來的m行,每一行的有n個數,第i個數表示第i個公司用第(多少行)
> output
輸出最大盈利。
> sample input
15 10
36 67 86 8 82 88 1 96 75 82
107 68 136 105 99 104 61 176 127 133
184 120 223 179 198 134 113 247 225 205
283 136 273 217 249 140 117 312 296 205
286 207 315 306 291 224 209 346 370 272
292 279 317 332 372 227 223 375 370 295
361 327 363 373 453 277 286 410 463 316
393 413 369 387 542 302 289 419 473 393
425 443 455 407 561 358 336 477 491 445
469 521 554 478 589 440 364 572 537 512
475 534 570 520 603 530 405 574 602 593
496 542 591 547 654 587 431 587 664 637
577 632 657 645 700 635 527 620 680 680
656 643 670 670 730 715 573 676 721 707
713 719 685 685 757 770 642 744 728 745
> sample output
1167
> 解題思路
用dp來做肯定得先劃分階段和狀態
把輸入的這一堆數化做一張**,橫向為第i家公司,縱向為j個機械可以獲得的盈利。(就是這一題的輸入有點兒神奇,第i行的輸入表示其中第j家公司用i個機械可以獲得的盈利,但其實只用在輸入那兒處理一下就行了)
然後把公司作為階段(i),多少個機械作為盈利(j),f[i][j]表示前i個公司用j個機械可以獲得的最大盈利,k來劃分界線:
每一次求出最優盈利f[i][j]。
再囉嗦一下:a陣列,也就是輸入的那一堆東西是需要儲存的,因為它要知道第i個公司用j-k個機械有多少盈利
狀態轉移方程:
f[i][j]=f[i-1][k]+a[i][j-k]
> **
#include
#include
#include
using namespace std;
int n,m,a[11]
[16],f[11]
[16];
int main()
printf
("%d"
,f[n]
[m])
;//輸出n家公司用j個機械的最大盈利
return0;
}
DP 機器分配
總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。第一行儲存兩個數,第乙個數是裝置台數m,...
機器分配 DP
題目 總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。輸入 第一行儲存兩個數,第乙個數是...
分配教室 DP
傳送門 考試時竟然推出了dp 好開心 和普通選連續一段的題類似 f i 表示 1 i 區間的最小代價 其中limit i 為連續的一段 我們預處理一些limit 和兩種課的字首和 s1,s2 就可以了 include define n 2550 define inf 0x3fffffff using...