#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()