机械分配【DP】

> 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来划分界线:

循环前i-1个公司用k个机械,第i个公司用j-k个机械

每一次求出最优盈利f[i][j]。

再啰嗦一下:a数组,也就是输入的那一堆东西是需要保存的,因为它要知道第i个公司用j-k个机械有多少盈利

状态转移方程:

f[i][j]=f[i-1][k]+a[i][j-k]


> 代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[11][16],f[11][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++) //循环公司
	 for(int j=1;j<=m;j++) //循环机械数
	 {
	 	f[i][j]=a[i][j];//这里设个初值
	 	for(int k=1;k<=j;k++)
	 	 f[i][j]=max(f[i][j],f[i-1][k]+a[i][j-k]); //求出最优值
	 }
	printf("%d",f[n][m]); //输出n家公司用j个机械的最大盈利
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/84885539
DP