dp4

时间:2021-08-10 06:39:41

T1.机器分配(machine)

题目大意:把N台机器分给M个公司,每个公司分到不同数量机器有不同利润,求分配的最大利润。

N<=100,M<=100

解题思路:一眼题啊。设a[x][y]为第x个公司分到y台的利润,f[i][j]为前i个公司共分到j台的最大利润,假设第i个公司分到k台,那么f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k]),k∈[0,j].显然答案为f[n][m].

空间上应该可以优化到一维数组的。。。枚举i=1 to n ,f[j]为前i个公司分到j台的最大利润,只要改为j=m  down to 1算出来就好了。

T2.物品装箱问题(box)

题目大意:01背包,只不过每件“物品”有两个物品可供选择,不能同时选。

解题思路:01背包加一句max判断第二种物品就好了。

T3.快餐问题(meal)

题目大意:一套快餐含有a个汉堡b个薯条c个饮料,现在有n条流水线,每条生产时间t[i],一个汉堡、薯条、饮料分别要p1、p2、p3时间生产,求一天最多生产几套。

解题思路:一开始看到题目想到了很原始的暴力,把流水线总时间相加,除以一套的总时间,得出一个暴力解。(完全错误的解法,不过还是可以骗到60分的,不妨宣称是60分做法)

正解:把每台机器分别尽量按整套生产,得到总套数为wx,然后把剩下的时间进行动归。设f[i][j][k]为前i台机器生产j个汉堡,k个薯条之后还能生产的饮料个数,j’表示第i台机器生产的汉堡个数,k’表示第i台机器生产的薯条个数。

f[i][j][k]=max(f[i-1][j-j’][k-k’]+(t[i]-j’*p1-k’*p2)/p3) .

只要枚举每个j’和k’就行了。这样得到最大套数wy就是

wy=max(min(i/a,j/b,f[n][i][j]/c));

那么ans=wx+wy.

尤其注意:

  1. 要注意计算最大个数,由于每天最多生产100个,所以不可能超过100/min(a,b,c);
  2. 枚举过程中要随时用当前变量控制下一层变量的取值范围。
  3. 去掉没有用的状态,比如前两个不够,第三个已经过多

T4.火车进站(train)

题目大意:一个火车站能同时停m辆车(m<=3),共有n个停靠申请,为到达时刻和出站时刻,求申请的最大接受量。

解题思路:既然m只有3,那就分为3类来做。

先将申请排序,进站时刻为第一关键字,出站第二。

设r[i].t & r[i].tt分别为第i辆火车的进站和出站时间。

m=1时,如果要同时接受i、j两辆车,就要满足

r[i].tt<=r[j].t

那么f[i]为接受第i辆车时已接受的最大车数。

f[i]=max(f[j])+1;初始f[1]=1,其他为0;枚举j=1 to i-1就好了。

m=2时,如果同时接受i、j,以及k辆车,

r[i].tt<=r[k].t,r[i].tt<r[j].tt.

同样的,f[i][j]为接受i、j两辆车时已接受的最大火车数。

f[i][j]=max(f[k][i]+1);初始全为2;枚举k=1 to i-1.

m=3时,如果接受i、j、k,以及l辆车。

f[i][j][k]=max(f[l][i][j]+1);初始全为3;枚举l=1 to i-1.

最后的答案是取f数组中的最大值。

相关文章