Problem p02683 (python)

Fixed submission:

N, M, X = map(int, input().split())
C = []
A = []
for  i in range(N):
    t = list(map(int, input().split()))
    C.append(t[0])
    A.append(t[1:])
    
result = -1
"""
<< bit演算に関する演算子
左辺の値を右辺の値だけ左へシフトすることを意味する

https://www.javadrive.jp/python/num/index4.html

下記の場合、1からNまで2真数でシフトしていく感じ
"""

for i in range(1 << N):
    #初期化
    t = [0] * M
    c = 0
    #print(i)
    for j in range(N):
        #print(j)
        if(i >> j ) & 1 == 0 :
            continue
        c += C[j]
        for k in range(M):
            t[k] += A[j][k]
    if all(x >= X for x in t):
        if result == -1:
            result = c
        else:
            result = min(result, c)
print(result)

Buggy submission (verdict: Runtime Error):
if __name__ == '__main__':
    n, m, x = list(map(int, input().split()))

    # 空のリストを作って、appendで追加していきます
    c = []  # 参考書の値段です
    a = []  # 各参考書に入る理解度です

    for i in range(n):
        c_temp, *a_temp = list(map(int, input().split()))  # こうすると、2つ目以降をリストで受け取れます
        c.append(c_temp)
        a.append(a_temp)

    INF = float("inf")
    ans = INF

    for bit in range(1 << n):
        price = calc_price(bit)  # 条件を満たすならそのときの値段、満たさないならINFが返ってきます
        ans = min(ans, price)  # 答えを更新します

    if ans == INF:
        print(-1)  # どうやっても条件を満たせなかった
    else:
        print(ans)
        
def calc_price(bit):
    price_total = 0  # 値段の合計
    learn_total = [0] * m  # 理解度

    for i in range(n):
        if (bit >> i) & 1:  # i桁目が0か1か見て、i冊目を買うか買わないか判定します
            price_total += c[i]  # 買うので、i冊目の値段を加算します
            learn = a[i]  # 「i冊目の参考書を読んで増える、各アルゴリズムの理解度」のリストです
            for j, la in enumerate(learn):  # 理解度を加算します enumerateを使うと、range(n)よりスマートです
                learn_total[j] += la

    # 条件を満たすか、check関数で確認します
    if check(learn_total):
        return price_total 　# 条件を満たすので、値段を返します
    else:
        return INF # 条件を満たさないので、INFを返します
     
  def check(learn_total):
    for i in range(m):
        if learn_total[i] < x:
            return False  # 1個でもx未満ならFalse
    return True # 全部x以上ならTrue

Buggy submission (verdict: Runtime Error):
def calc_price(bit):
	# 値段の合計
	price_total = 0
  # 理解度
	learn_total = [0] * m 
	
	for i in range(n):
		# i桁目が0か1か見て、i冊目を買うか買わないか判定します
		if (bit >> i) & 1;
			# 買うので、i冊目の値段を加算します
			price_total += c[i]
			# 「i冊目の参考書を読んで増える、各アルゴリズムの理解度」のリストです
			learn = a[i]
			# 理解度を加算、
      # enumerateを使うと、range(n)よりスマートです
      # 引数にリストなどのイテラブルオブジェクトを指定する。
			for j, la in enumerate(learn):
				learn_total[j] += la

			#条件を満たすかどうかcheck関数で確認
			if check(learn_total):
			# 条件を満たすので、値段を返します
				return price_total
			else:
			# 条件を満たさないので、INFを返します
				return INF

def check(learn_total):
    for i in range(m):
        if learn_total[i] < x:
            return False  # 1個でもx未満ならFalse
    return True # 全部x以上ならTrue

if __name__ == '__main__':
	n, m, x = list(map(int, input().split()))
	
	#からのリストを作ってappendで追加していく
	c = [] #参考書の値段
	a = [] #書く参考書に入る理解度
	
	for i in range(n):
		c_temp, a_temp = list(map(int, input().split()))
		c.append(c_temp)
	  a.append(a_temp)
	
	INF = float("inf")
	ans = INF
	
	for bit in range(1 << n):
		# 条件を満たすならそのときの値段、満たさないならINFが返ってきます
		price = calc_price(bit)
	  # 答えを更新
		ans = min(ans, price)
	
	if ans == INF:
		price(-1)
	else:
	  price(ans)

Buggy submission (verdict: Runtime Error):
n, m, x = list(map(int, input().split()))

#からのリストを作ってappendで追加していく
c = [] #参考書の値段
a = [] #書く参考書に入る理解度

def calc_price(bit):
	# 値段の合計
	price_total = 0
  # 理解度
	learn_total = [0] * m 
	
	for i in range(n):
		# i桁目が0か1か見て、i冊目を買うか買わないか判定します
		if (bit >> i) & 1;
			# 買うので、i冊目の値段を加算します
			price_total += c[i]
			# 「i冊目の参考書を読んで増える、各アルゴリズムの理解度」のリストです
			learn = a[i]
			# 理解度を加算、
      # enumerateを使うと、range(n)よりスマートです
      # 引数にリストなどのイテラブルオブジェクトを指定する。
			for j, la in enumerate(learn):
				learn_total[j] += la

			#条件を満たすかどうかcheck関数で確認
			if check(learn_total):
			# 条件を満たすので、値段を返します
				return price_total
			else:
			# 条件を満たさないので、INFを返します
				return INF

def check(learn_total):
    for i in range(m):
        if learn_total[i] < x:
            return False  # 1個でもx未満ならFalse
    return True # 全部x以上ならTrue

for i in range(n):
	c_temp, a_temp = list(map(int, input().split()))
	c.append(c_temp)
  a.append(a_temp)

INF = float("inf")
ans = INF

for bit in range(1 << n):
	# 条件を満たすならそのときの値段、満たさないならINFが返ってきます
	price = calc_price(bit)
  # 答えを更新
	ans = min(ans, price)

if ans == INF:
	price(-1)
else:
  price(ans)