本题可以看成经典的完全背包 / 最少硬币数问题。
有 4 种任务,每种任务的资源消耗分别为 A,B,C,D。对于每台机器的内存大小 X,需要用若干个任务消耗值相加得到 X,并且任务数量尽量少。
设 dp[i] 表示组成资源消耗 i 所需的最少任务数量。
状态转移为:
虚拟机环境里有 4 种不同类型的任务,每种任务消耗的 RAM 各不相同,消耗的资源分别为 A、B、C、D。 假定4种任务待调度的数量无限多,小明手里有 N 台机器,这 N 台机器的 RAM 配置各不相同。 为了在保证机器利用率的前提下,减少 CPU 资源的争抢,小明希望这 N 台机器,分配的 RAM 任务占满的同时,任务数量越少越好。
输入的第一行为四个整数,表示四种不同类型任务的资源消耗,A B C D(1≤A,B,C,D≤103),保证不重复,一定保证有消耗为1的任务,使机器一定可以被填满。
输入的第二行为机器数量N,(1≤N≤103)
后续N行,每一行给出每台机器的RAM大小X,取值范围为 1≤X≤11000。
输出为N行,每行表示机器的任务组成情况,以升序排列,加号分割,若存在多种最少的任务分配组合,选择升序排列后,按顺序比较数字中字典序最小的组合输出。如1+3和2+2两个升序序列,按顺序比较第一个数字 1<2,则应该输出1+3这个组合。
输入
1 7 3 5
2
14
4
输出
7+7
1+3
解释:
1、14选取两个7任务正好组成14 2、4可由1+3构成。
输入
1 2 3 5
1
4
输出
1+3
解释:4可由1+3或者2+2构成,按输出排序规则,使用升序排列后,按顺序比较数字最小的序列1+3。