結果

問題 No.4 おもりと天秤
ユーザー ynishimuraynishimura
提出日時 2020-12-10 16:12:49
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 115 ms / 5,000 ms
コード長 2,336 bytes
コンパイル時間 90 ms
コンパイル使用メモリ 11,872 KB
実行使用メモリ 14,044 KB
最終ジャッジ日時 2023-10-20 00:46:22
合計ジャッジ時間 2,238 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 28 ms
10,148 KB
testcase_01 AC 28 ms
10,148 KB
testcase_02 AC 30 ms
10,188 KB
testcase_03 AC 29 ms
10,152 KB
testcase_04 AC 29 ms
10,200 KB
testcase_05 AC 58 ms
12,248 KB
testcase_06 AC 28 ms
10,148 KB
testcase_07 AC 57 ms
12,272 KB
testcase_08 AC 29 ms
10,148 KB
testcase_09 AC 115 ms
14,044 KB
testcase_10 AC 61 ms
12,516 KB
testcase_11 AC 29 ms
10,148 KB
testcase_12 AC 29 ms
10,148 KB
testcase_13 AC 28 ms
10,148 KB
testcase_14 AC 29 ms
10,148 KB
testcase_15 AC 28 ms
10,148 KB
testcase_16 AC 30 ms
10,148 KB
testcase_17 AC 28 ms
10,148 KB
testcase_18 AC 64 ms
12,152 KB
testcase_19 AC 54 ms
12,036 KB
testcase_20 AC 55 ms
12,028 KB
testcase_21 AC 52 ms
11,912 KB
testcase_22 AC 54 ms
11,956 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

N = int(input()) # おもりの数
weight_list = list(map(int, input().split())) # おもりの重さ(半角スペース区切り)

weight_sum = sum(weight_list)
half = weight_sum // 2
# possibleかimpossibleを返すだけなので、重さを気にする必要ない
# 全てのおもりを使って天秤が水平 => 片方に全重さ/2となるか判定
# おもり(100以下の重さのおもりが100個以下)

def check():
    if weight_sum % 2 != 0: # おもりの重さの合計が奇数のときimpossible
        print("impossible")
        sys.exit(0) # 終了
    else:
        '''
        # ex) 1 2 3
        # 重りの合計/2 = 3
        # 縦(重りの数)i x 横(重りの合計/2)j
        [[True, False, False, False],
         [True, False, False, False],
         [True, False, False, False],
         [True, False, False, False]]
         
        #dp[重りの数(i)][(重りの合計/2)までの数字(j)] : i番目まで見た時に重さjを作ることができるか判定していく

        '''
        dp = [[True] + [False]*(half + 1) for i in range(N)] # 最初はTrue,
        for i in range(N):
            for j in range(half + 1):
                # dp[i番目までのおもりを見た時][左側の重さj]
                # i番目のおもりの時に,左側の重さがjが存在するか判定
                # j - weight_list[i]
                # 重りの合計/2(j) から 対象の重りの重さ(weight_list[i]) を 引く

                if dp[i-1][j]: # 一つ前の判定でTrue
                    dp[i][j] = True # 組み合わせが存在する
                    continue
                if j - weight_list[i] < 0: # 作りたい重さよりおもりが重い => 作れない
                    # omori_now = weight_list[i]
                    # omori_sum_yoko = j
                    # omori_kazu_tate = i
                    continue
                if dp[i-1][j - weight_list[i]]: # 作りたい重さで足りなかった分の重さは作れるか
                    # omori_now = weight_list[i]
                    # omori_sum_yoko = j
                    # omori_kazu_tate = i
                    dp[i][j] = True

    if dp[-1][weight_sum//2]:
        print('possible')
    else:
        print('impossible')


if __name__ == "__main__":
    check()
0