题解 P1164 【小A点菜】 python

· · 题解

看了一圈,发现没有python的题解,再加上本菜鸡用python做本题时遇到了一个输入的小坑

话不多说,先上python题解


n,m=[int(x) for x in input().split()]
#n个菜 m元钱
a=[]
while not len(a)>=n:
    t=[int(x) for x in input().split()]
    a.extend(t)
a.insert(0,0)
f=[[0 for i in range(m+2)] for j in range(n+2)]
#f[i][j] 表示j元选择i种菜的方法
for i in range(1,n+1):
    for j in range(1,m+1):
        #print(i)
        #print(a[i])
        if j==a[i]:#刚好购买
            f[i][j]=f[i-1][j]+1
        elif j>a[i]:#剩余前比第i道菜多
            f[i][j]=f[i-1][j]+f[i-1][j-a[i]]
        else:
            f[i][j]=f[i-1][j]

print(f[n][m])

关键的代码在于python的输入部分
用了一个while循环判断来完成输入
为什么要这样呢?

其实如果用正常的输入按理来说是可以过,然而测试数据却好像有意在刁难python选手
放出一个RE的测试数据:

22 20
2 3 3 4 5 4 5 5 10 23 4 5
10 10 10 10 10 10 17 18 19 20

ai 的输入被隔开成了两行,而python普遍的输入是使用input().split()来实现的,也就是只会读取一行数据
这就导致后面的内容没有输入进去,于是就是数组越界,出RE
因此需要判断是否输入的数据达到了N个,否则继续输入

底层蒟蒻首次发题解,望通过