【动态规划】机器分配 (ssl 1639)

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/84886339

机器分配

Description

总公司拥有高效生产设备M台,准备分给下属的N个公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M《=15,N〈=10。分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。

Input

第一行保存两个数,第一个数是设备台数M,第二个数是分公司数N。接下来是一个M*N的矩阵,表明了第I个公司分配J台机器的盈利。

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

题目大意:

有M台设备,给N个人,去工作,输入第二行开始,第i行表示的是获得i台设备,N个人分别可以制造的money,最多可制造多少money?

解题方法:

因为读入很特殊,要先用一个二维数组(a)读入,然后再用类似多重背包的借此即可(多重背包请看此csdn第一题“庆功会”)

动态转移方程:

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[11][16],f[16];
int main()
{
	scanf("%d%d",&m,&n);
	for (int i=1;i<=m;i++)
	  for (int j=1;j<=n;j++)
	    scanf("%d",&a[j][i]);
	for (int i=1;i<=n;i++)//前i个人
	  for (int j=m;j>0;j--)//用j部电脑
	    for (int k=1;k<=j;k++)//第i个人用k部电脑
	      f[j]=max(f[j],f[j-k]+a[i][k]);
	printf("%d",f[m]);
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/84886339
今日推荐