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

【DP】機器分配

題目

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

輸入

第一行儲存兩個數,第一個數是裝置臺數M,第二個數是分公司數N。接下來是一個M*N的矩陣,表明了第I個公司分配J臺機器的盈利。

輸出

最大盈利

樣例

輸入

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

輸出

1167

解題思路

設f[j]為使用j臺所獲得的最大利益。
狀態轉移方程:
f [ j ] = m a x

( f [ j ] , f [ j k
] + a [ i ] [ k ] ) f[j]=max(f[j],f[j-k]+a[i][k])

程式碼

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,a[101][101],f[101];
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	 for (int j=1;j<=m;j++)
	  scanf("%d",&a[j][i]);//讀入
	  for (int i=1;i<=m;i++)//列舉每一個公司
	for (int j=n;j>=0;j--)//列舉每一臺的利益
		for (int k=1;k<=j;k++)//列舉每一種情況
			f[j]=max(f[j],f[j-k]+a[i][k]);
			printf("%d",f[n]);
}