結果
問題 | No.15 カタログショッピング |
ユーザー | rpy3cpp |
提出日時 | 2015-08-08 00:05:45 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 136 ms / 5,000 ms |
コード長 | 1,380 bytes |
コンパイル時間 | 365 ms |
コンパイル使用メモリ | 10,912 KB |
実行使用メモリ | 27,336 KB |
最終ジャッジ日時 | 2023-09-25 06:30:49 |
合計ジャッジ時間 | 1,830 ms |
ジャッジサーバーID (参考情報) |
judge14 / judge11 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 19 ms
8,692 KB |
testcase_01 | AC | 19 ms
8,612 KB |
testcase_02 | AC | 20 ms
8,756 KB |
testcase_03 | AC | 20 ms
8,788 KB |
testcase_04 | AC | 19 ms
8,588 KB |
testcase_05 | AC | 136 ms
27,248 KB |
testcase_06 | AC | 132 ms
27,336 KB |
testcase_07 | AC | 130 ms
27,336 KB |
testcase_08 | AC | 126 ms
27,276 KB |
testcase_09 | AC | 128 ms
27,176 KB |
ソースコード
import collections def read_data(): N, S = map(int, input().split()) Ps = [int(input()) for n in range(N)] return N, S, Ps def solve(N, S, Ps): if N == 1: if S == Ps[0]: return [[1]] else: return [['Unexpected input data']] n0 = N // 2 n1 = N - n0 dp0 = bfs(n0, Ps[:n0], S) dp1 = bfs(n1, Ps[n0:], S) paths = [] for s0 in dp0: s1 = S - s0 if s1 in dp1: for path1 in dp1[s1]: path1x = path1 << n0 for path0 in dp0[s0]: paths.append(path0 + path1x) result = [unpack(path) for path in paths] result.sort() return result def bfs(n, Ps, S): dp = collections.defaultdict(list) dp[0].append(0) for i, p in enumerate(Ps): bit = 1 << i cumsums = list(dp.keys()) cumsums.sort(reverse=True) for cumsum in cumsums: if cumsum + p <= S: newpaths = [path + bit for path in dp[cumsum]] dp[cumsum + p].extend(newpaths) return dp def unpack(path): idx = 0 result = [] while path: idx += 1 if path & 1: result.append(idx) path >>= 1 return result if __name__ == '__main__': N, S, Ps = read_data() result = solve(N, S, Ps) for path in result: print(*path)