結果
| 問題 | No.10 +か×か |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2014-10-11 03:51:56 |
| 言語 | PyPy2 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,552 bytes |
| 記録 | |
| コンパイル時間 | 147 ms |
| コンパイル使用メモリ | 77,616 KB |
| 最終ジャッジ日時 | 2025-12-03 12:48:44 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 WA * 2 |
ソースコード
# -*- coding: utf-8 -*-
def solve(N, total, A):
MAX = (1 << N + 2)
dp = [MAX] * (total + 1)
# 結果をビットで保存するDP
dp[A[0]] = 0
for i, a in enumerate(A[1:]):
for v in xrange(total, 0, -1):
if dp[v] == MAX:
continue
current = dp[v]
# 1倍の時に上書きされてしまう対策
mul_change = False
if v * a <= total:
if i == 0:
dp[v * a] = (1 << ((N - 2) - i))
mul_change = True
else:
if a == 1:
mul_change = True
dp[v * a] = current | (1 << ((N - 2) - i))
else:
dp[v * a] = min(dp[v * a], current | (1 << ((N - 2) - i)))
if v + a <= total:
if i == 0:
dp[v + a] = 0
else:
dp[v + a] = min(dp[v + a], current)
if not mul_change:
# 1倍の時以外はMAXにする。
# 1倍の時にすると値が消えてしまう。
dp[v] = MAX
ans_bit = dp[total]
if ans_bit == MAX:
return None
ans = ""
while N > 1:
ans = ("*" if ans_bit & 1 else "+") + ans
ans_bit >>= 1
N -= 1
return ans
N = int(raw_input())
total = int(raw_input())
A = map(int, raw_input().split(" "))
print solve(N, total, A)