結果
問題 | 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 |
コンパイル時間 | 87 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 29,784 KB |
最終ジャッジ日時 | 2024-07-18 05:28:15 |
合計ジャッジ時間 | 1,427 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 30 ms
10,880 KB |
testcase_01 | AC | 29 ms
11,008 KB |
testcase_02 | AC | 28 ms
11,136 KB |
testcase_03 | AC | 29 ms
10,880 KB |
testcase_04 | AC | 29 ms
10,880 KB |
testcase_05 | AC | 136 ms
29,576 KB |
testcase_06 | AC | 135 ms
29,572 KB |
testcase_07 | AC | 135 ms
29,704 KB |
testcase_08 | AC | 131 ms
29,784 KB |
testcase_09 | AC | 130 ms
29,524 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)