写在前面
我看过很多版本的答案,我觉得我的这个思路应该是最简单的一种。按照正确思路,每个包子能凑出的数应该是它们的最大公约数
的倍数,但是这种写法结合背包也是比较复杂的。
新颖思路
定义$dp[i]$为$i$个包子是否能被凑出,状态转移方程就是$max(dp[i], dp[i-a[j]])$,$a[j]$表示$j$种包笼能放的包子数,这个状态转移方程应该是非常好理解的。
因为数据量都是$100$,我们可以定义一个$N=100000$,如果$dp$中的$0$元素大于$50000$,说明是$INF$的情况,因为如果不为$INF$的话,到一定值的时候每一个包子都是可以取到的。
具体细节参考代码,时间复杂度$O(10^7)$。
参考代码
n = int(input())
a = [int(input()) for _ in range(n)]
a.sort(); N = 100000
dp = [0] * N
dp[0] = 1
for i in range(a[0], N):
for j in a:
dp[i] = max(dp[i], dp[i-j])
ans = 0
for i in range(N):
if dp[i] == 0:
ans += 1
if ans > N/2: print('INF')
else: print(ans)