一开始我还真按完全背包的思路去做了,结果发现初始化好像走不通。

在我完全背包的思路中也想到了将数列中的每个数都模3,f(i, j)表示从前i个数中选,能恰好满足j%3==0的最少物品数量。

结果最后才发现是多此一举了,每个物品的价格都模3了,最后能凑出来的结果不是很显然了吗,直接判读就可以了。

最后能被3整除的有以下情况:

  1. 数列中存在不为0个的模3余0的数,直接选一个这个数即可。

  2. 数列中不存在模3余0的数,仅存在模3余1的数,此时选三个这种数即可。

  3. 数列中不存在模3余0的数,存在模3余1与模3余2的数,选两个这种数即可。

  4. 数列中不存在模3余0的数,仅存在模3余2的数,选3个这种数即可。

n, p = map(int, input().split())
a = list(map(int, input().split()))
cnt0, cnt1, cnt2 = 0, 0, 0
for i in range(n):
    if a[i] % 3 == 0:
        cnt0 += 1
    if a[i] % 3 == 1:
        cnt1 += 1
    if a[i] % 3 == 2:
        cnt2 += 1
if cnt0 != 0:
    print(1)
elif cnt0 == 0 and cnt1 != 0 and cnt2 != 0:
    print(2)
elif cnt0 == 0 and cnt1 != 0 and cnt2 == 0:
    print(3)
elif cnt0 == 0 and cnt1 == 0 and cnt2 != 0:
    print(3)