結果
問題 | No.2700 Please Hack Greedy Solution! |
ユーザー | navel_tos |
提出日時 | 2024-03-29 23:32:56 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 155 ms / 500 ms |
コード長 | 1,219 bytes |
コンパイル時間 | 391 ms |
コンパイル使用メモリ | 82,332 KB |
実行使用メモリ | 89,216 KB |
最終ジャッジ日時 | 2024-09-30 17:02:51 |
合計ジャッジ時間 | 1,484 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ソースコード
#yukicoder424B Please Hack Greedy Solution from fractions import Fraction as Fc #0-1Knapsackの貪欲解と厳密解を書く def solve(N, W, P): assert len(P) == N DP = [- 10 ** 18] * (W + 1) DP[0] = 0 for v, w in P: nDP = [- 10 ** 18] * (W + 1) for i in range(W + 1): nDP[i] = max(nDP[i], DP[i]) if i + w <= W: nDP[i + w] = max(nDP[i + w], DP[i] + v) DP, nDP = nDP, DP ans = [0] * (W + 1) for w, v in enumerate(DP): ans[w] = max(ans[w], v) if w < W: ans[w + 1] = max(ans[w + 1], ans[w]) return ans def greedy(N, W, P): Q = sorted([(Fc(v, w), w, v) for v, w in P], reverse = True) DP = [0] * (W + 1) for p in range(1, W + 1): q, G = p, 0 for _, w, v in Q: if w <= q: q, G = q - w, G + v DP[p] = G return DP def make(N = 1000, W = 1000): P = [i for i in range(N + 1)] #weight V = [0] * (N + 1) #value V[1] = (10 ** 9) // N V[N] = 10 ** 9 - 1 for i in range(N - 1, 1, -1): V[i] = (V[i + 1] - V[1]) - 1 print(N, W) for i in range(1, N + 1): print(V[i], P[i]) #実行 make()