AtCoder茶色解く3
今回解くのはこちら
C - Skill Up
本を購入するしないの2通りを全本の組み合わせに対して行うbit全探索であると推測、
進めていきます。
12冊の本を買ったか買っていないかでフラグ管理するとすると、
2^12=4^4=16^2=256通りで試せばいいことになります。
例えば以下のサンプルがある場合
3 3 10 60 2 2 4 70 8 7 9 50 2 3 9
n=5の場合、2進数で表すと101となります。
60 2 2 4と50 2 3 9が1となり採用され、残りの1行は採用されません。
それぞれの値は配列(aとする)に足しこまれます。
a=[60 2 2 4]+[50 2 3 9]=[110 4 5 13]となります。
その後、これらを比較し、a[1]~a[3]に対して必要スキルレベル以上かどうかを判定します。
今回は10に届かないので、この値は破棄します。
n, m, x = map(int, input().split()) inp=[] # 入力をすべて受け取る for i in range(n): tmp = list(map(int, input().split())) inp.append(tmp) # bit全探索を行うための箱づくり sum = 0 min = 10**10 for i in range(2**n): tmp = [0]*m flg = 0 # ある買う買わないのケースに対して、フラグが立ってたらスキルポイントを増やす for j in range(n): if ((i >> j) & 1): # 順に右にシフトさせ最下位bitのチェックを行う sum += inp[j][0] for k in range(1,m+1): #print(n,j, k, tmp, inp) tmp[k-1] += inp[j][k] for ii, k in enumerate(tmp): if k < x: # x未満ならflgをたててNGとする flg = 1 break #print(tmp, flg) if sum < min and flg == 0: min = sum sum = 0 if min == 10**10: min = -1 print(min)
bit全探索自体を作るのに時間がかかってしまったので、ほかの問題も解いてコツをつかみたい