Problem p03290 (python)

Fixed submission:
# coding: utf-8
ranknum,goal = list(map(int,input().split()))
probnum = [0]*ranknum
bonus = [0]*ranknum
compscore = [0]*ranknum

for i in range(ranknum):
    probnum[i], bonus[i] = list(map(int,input().split()))
    #各ランクをコンプした場合に得られる得点をcompscoreに格納しておく。
    compscore[i] = 100*(i+1)*probnum[i] + bonus[i]

from itertools import product
from math import ceil

#得点Gを達成する最小の問題正解数minprobを初期化。前提により必ず1000以下になるので、1001で初期化しておく。
minprob = 1001

#各ランクの問題をコンプするか否かの2^ranknum通りをループ処理する。
for c in product(range(2),repeat=ranknum):
    score = 0
    solvedprob = 0
    notcompedindex = -1

    #コンプした問題について、得点をcompscoreに、正解数をsolvedprobnumに格納する。
    for i in range(ranknum):
        if c[i] == 1:
            score +=  compscore[i]
            solvedprob +=  probnum[i]
        #コンプされていないランクのインデックスのうち最大のものをnotcompedindexに格納しておく。
        else:
            notcompedindex = i

    #コンプした問題だけでgoalに達さず、かつ、コンプしていない最高ランクの問題をコンプ寸前まで解けばゴールに達する場合、
    #ゴールをぎりぎり達成するところまで正解した状態へと、scoreとsolvedprobを更新する。
    if score < goal and score+100*(notcompedindex+1)*(probnum[notcompedindex]-1) >= goal:
        solvedprob += ceil((goal - score)/(100*(notcompedindex+1)))
        score += ceil((goal - score)/(100*(notcompedindex+1)))*100*(notcompedindex+1)
    
    #最終的にゴールを達成している場合、正解数が暫定最小ならば、それをminprobに格納しておく。
    if score >= goal:
        minprob = min(minprob, solvedprob)  

print(minprob)

# print(ranknum)
# print(goal)
# print(problemnum)
# print(bonus)
# print(completescore)

Buggy submission (verdict: Runtime Error):
# coding: utf-8
ranknum,goal = list(map(int,input().split()))
probnum = [0]*ranknum
bonus = [0]*ranknum
compscore = [0]*ranknum


for i in range(ranknum):
    probnum[i], bonus[i] = list(map(int,input().split()))
    #各ランクをコンプした場合に得られる得点をcompscoreに格納しておく。
    compscore[i] = 100*(i+1)*probnum[i] + bonus[i]

from itertools import product
from math import ceil

#得点Gを達成する最小の問題正解数minprobを初期化。前提により必ず1000以下になるので、1001で初期化しておく。
minprob = 1001

#各ランクの問題をコンプするか否かの2^ranknum通りをループ処理する。
for c in product(range(2),repeat=ranknum):
    # print(c)
    score = 0
    solvedprob = 0
    notcompedindex = -1

    #コンプした問題について、得点をcompscoreに、正解数をsolvedprobnumに格納する。
    for i in range(ranknum):
        if c[i] == 1:
            score +=  compscore[i]
            solvedprob +=  probnum[i]
        #コンプされていないランクのインデックスのうち最大のものをnotcompedindexに格納しておく。
        else:
            notcompedindex = i
    # print("score:" + str(score))
    # print("solvedprob:" + str(solvedprob))
    # print("notcompedindex:" + str(notcompedindex))
    
    #コンプした問題だけでgoalに達さず、かつ、コンプしていない最高ランクの問題をコンプ寸前まで解けばゴールに達する場合、
    #ゴールをぎりぎり達成するところまで正解した状態へと、scoreとsolvedprobを更新する。
    if score <= goal and score+100*(notcompedindex+1)*(probnum[notcompedindex]-1) >= goal:
        # print("addition")
        solvedprob += ceil((goal - score)/(100*(notcompedindex+1)))
        score += ceil((goal - score)/(100*(notcompedindex+1)))*100*(notcompedindex+1)
    
    #最終的にゴールを達成している場合、正解数が暫定最小ならば、それをminprobに格納しておく。
    if score >= goal:
        minprob = min(minprob, solvedprob)  
    # print("score:" + str(score))
    # print("solvedprob:" + str(solvedprob))
    # print("minprob:" + str(minprob))

print(minprob)

# print(ranknum)
# print(goal)
# print(problemnum)
# print(bonus)
# print(completescore)

Buggy submission (verdict: Runtime Error):
# coding: utf-8
ranknum,goal = list(map(int,input().split()))
probnum = [0]*ranknum
bonus = [0]*ranknum
compscore = [0]*ranknum


for i in range(ranknum):
    probnum[i], bonus[i] = list(map(int,input().split()))
    #各ランクをコンプした場合に得られる得点をcompscoreに格納しておく。
    compscore[i] = 100*(i+1)*probnum[i] + bonus[i]

from itertools import product
from math import ceil

#得点Gを達成する最小の問題正解数minprobを初期化。前提により必ず1000以下になるので、1001で初期化しておく。
minprob = 1001

#各ランクの問題をコンプするか否かの2^ranknum通りをループ処理する。
for c in product(range(2),repeat=ranknum):
    print(c)
    score = 0
    solvedprob = 0
    notcompedindex = -1

    #コンプした問題について、得点をcompscoreに、正解数をsolvedprobnumに格納する。
    for i in range(ranknum):
        if c[i] == 1:
            score +=  compscore[i]
            solvedprob +=  probnum[i]
        #コンプされていないランクのインデックスのうち最大のものをnotcompedindexに格納しておく。
        else:
            notcompedindex = i
    print("score:" + str(score))
    print("solvedprob:" + str(solvedprob))
    print("notcompedindex:" + str(notcompedindex))
    
    #コンプした問題だけでgoalに達さず、かつ、コンプしていない最高ランクの問題をコンプ寸前まで解けばゴールに達する場合、
    #ゴールをぎりぎり達成するところまで正解した状態へと、scoreとsolvedprobを更新する。
    if score <= goal and score+100*(notcompedindex+1)*(probnum[notcompedindex]-1) >= goal:
        print("addition")
        solvedprob += ceil((goal - score)/(100*(notcompedindex+1)))
        score += ceil((goal - score)/(100*(notcompedindex+1)))*100*(notcompedindex+1)
    
    #最終的にゴールを達成している場合、正解数が暫定最小ならば、それをminprobに格納しておく。
    if score >= goal:
        minprob = min(minprob, solvedprob)  
    print("score:" + str(score))
    print("solvedprob:" + str(solvedprob))
    print("minprob:" + str(minprob))

print(minprob)

# print(ranknum)
# print(goal)
# print(problemnum)
# print(bonus)
# print(completescore)