Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8-alstjr7437 #25

Merged
merged 6 commits into from
Feb 16, 2024
Merged

8-alstjr7437 #25

merged 6 commits into from
Feb 16, 2024

Conversation

alstjr7437
Copy link
Member

@alstjr7437 alstjr7437 commented Feb 13, 2024

πŸ”— 문제 링크

ν‰λ²”ν•œ λ°°λ‚­

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

N - 4 / K - 7

weight value
6 13
4 8
3 6
5 12

κ΅ν™˜μ„Όμ„Έμ˜ 도움을 λ°›μ•„μ„œ DP 점화식을 κ·Έλ ΈμŠ΅λ‹ˆλ‹€....

index / 각 무게 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 13 13
1 0 0 0 0 8 8 13 13
2 0 0 0 6 8 8 13 14
3 0 0 0 6 8 12 13 13
  1. weight index 반볡문 돌리기(N) -> i
  2. DP의 μ—­λ°©ν–₯으둜 돌리기(k+1) -> j
  3. μ ν™”μ‹μœΌλ‘œ ν’€κΈ°
    • (총무게 - ν˜„μž¬ 무게)κ°€ 0보닀 크면(무게 μ΄ˆκ³Όκ°€ μ•„λ‹ˆλ©΄)
      • dp[j] = max(dp[j]의 value, dp(j-weight)의 value + ν˜„μž¬ index의 value)

μ΄λ ‡κ²Œ 말둜 μ μœΌλ‹ˆ 이해가 μ•ˆκ°€λ„€μš” 저도...

κ°„λ‹¨ν•˜κ²Œ μ—μ œλ‘œ 보면 μ•„λž˜μ™€ 같은 점화식이 μ™„μ„± λμŠ΅λ‹ˆλ‹€!
image

n, k = map(int, input().split())

weight = []
values = []

for i in range(n):
    a, b = map(int, input().split())
    weight.append(a)
    values.append(b)

dp = [0] * (k+1)

for i in range(n):
    for j in range(k,-1,-1):
        if j-weight[i] >= 0:
            dp[j] = max(dp[j], dp[j-weight[i]] + values[i])
print(max(dp))

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

dp 점화식 그리기도 νž˜λ“€κ³  μ„€λͺ…ν•˜κΈ°λ„ 정말 νž˜λ“œλ„€μš”...

@9kyo-hwang
Copy link

μ™œ λ‚΄λ‹€ 버리셨죠?

@tgyuuAn
Copy link
Member

tgyuuAn commented Feb 14, 2024

μ™œ λ‚΄λ‹€ 버리셨죠?

μ™œ λ‚΄λ‹€ 버리셨죠?

@alstjr7437
Copy link
Member Author

μ§„μ •ν•˜μ„Έμš” μ—¬λŸ¬λΆ„ 문제 μ„ μ •λ§Œ ν•΄λ‘¬μ„œ κ·Έλž¬μŠ΅λ‹ˆλ‹€..

@9kyo-hwang
Copy link

2차원 DPλŠ” 아무리 해도 적응이 μ•ˆλ˜λ„€μš”....

μ°Ύμ•„λ³΄λ‹ˆ λͺ¨λ“  경우의 μˆ˜μ— λŒ€ν•΄ 값을 κΈ°λ‘ν•˜μ§€ μ•Šκ³ , 1차원 dp 리슀트둜 ν•΄κ²°ν•œ μ½”λ“œκ°€ μžˆμ–΄ κ³΅μœ ν•΄λ³Όκ²Œμš”.

input = open(0).readline

N, K = map(int, input().split())
objects = sorted([tuple(map(int, input().split())) for _ in range(N)])

max_values = [0] * (K + 1) # 각 무게 별 μ΅œλŒ€ κ°€μΉ˜
for weight, value in objects:
    for max_load in range(K, -1, -1):  # 가방이 κ²¬λ”œ 수 μžˆλŠ” μ΅œλŒ€ 무게
        if weight > max_load:
            break
        
        max_values[max_load] = max(max_values[max_load - weight] + value, max_values[max_load])
        
print(max_values[K])

평ᄇα…₯ᆷᄒᅑᆫ-ᄇᅒᄂᅑᆼ

정렬을 해쀄 경우 κ°€λ²Όμš΄ 무게의 물건뢀터 κ²€μ‚¬ν•˜κΈ° λ•Œλ¬Έμ—, 검사할 수둝 확인해야 ν•˜λŠ” λ²”μœ„κ°€ μ’ν˜€μ§‘λ‹ˆλ‹€. 이런 μ μ—μ„œ 속도 상 이득이 μžˆμŠ΅λ‹ˆλ‹€.

@alstjr7437
Copy link
Member Author

@9kyo-hwang 이뢄이 잘 μ¨μ£Όμ…¨κ΅°μš”...

@SeongHoonC
Copy link
Collaborator

SeongHoonC commented Feb 14, 2024

μ €λŠ” 2μ°¨μ›μœΌλ‘œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€!

μœ„μ—μ„œλΆ€ν„° κ³„μ‚°ν•©λ‹ˆλ‹Ή.
1 번 λ„£μ—ˆμ„ λ•Œ 졜적
1, 2 번 λ„£μ—ˆμ„ λ•Œ 졜적
1, 2, 3번 λ„£μ—ˆμ„ λ•Œ 졜적
1, 2, 3, 4 번 λ„£μ—ˆμ„ λ•Œ 졜적
...

image
import sys
input = sys.stdin.readline

n, k = map(int, input().split())

thing = [[0,0]]
d = [[0]*(k+1) for _ in range(n+1)]

for i in range(n):
    thing.append(list(map(int, input().split())))

for i in range(1, n+1):
    for j in range(1, k+1):
        w = thing[i][0]
        v = thing[i][1]

        if j < w:
            d[i][j] = d[i-1][j]
        else:
            d[i][j] = max(d[i-1][j], d[i-1][j-w]+v)

print(d[n][k])

Copy link
Member

@fnzksxl fnzksxl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ €λŠ” λ°°λ‚­λ¬Έμ œμ˜ μ •μ„λŒ€λ‘œ ν•œ 번 ν’€μ–΄λ΄€λŠ”λ°μš”. @9kyo-hwang λ‹˜μ΄λž‘ 방식은 λ™μΌν•œλ°,
정렬은 μ•ˆ ν•΄μ€¬λ„€μš”. κ΅ν™©λ‹˜μ΄ μ μ–΄μ£Όμ‹œλŠ” 글듀은 λ­”κ°€ κΏ€νŒμ΄ μ°Έ λ§Žμ•„μ„œ μ’‹μŠ΅λ‹ˆλ‹€!
문제 풀이 잘 λ΄€μ–΄μš” λ―Όμ„λ‹˜

import sys

input = sys.stdin.readline

N, K = map(int, input().split())
items = []
dp = [0 for _ in range(K+1)]

for _ in range(N):
  items.append(tuple(map(int, input().split())))

for w, v in items:
  for i in range(K, w-1, -1):
    dp[i] = max(dp[i], dp[i-w]+v)

print(dp[K])

Copy link
Collaborator

@wkdghdwns199 wkdghdwns199 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

민석 λ‹˜ μ„€λͺ…보고 저도 ν•œ 번 κ΅¬ν˜„ν•΄ λ³΄λ‹ˆ μ½”λ“œκ°€ λ˜‘κ°™μ΄ λ‚˜μ˜€λ„€μš”! DP 문제 ν’€ λ•Œ 점화식을 μ°ΎλŠ” 게 μ§„μ§œ μ€‘μš”ν•œ κ±° 같은데, ν˜Ήμ‹œ 점화식을 μ‰½κ²Œ μ°ΎλŠ” λ…Έν•˜μš°κ°€ λ‹€λ“€ μžˆλ‚˜μš”?

제 μ½”λ“œμž…λ‹ˆλ‹€

n,k = map(int, input().split())

weight = [0 for _ in range(n)]
value = [0 for _ in range(n)]
dp = [0 for _ in range(k+1)]
for i in range(0, n):
    weight[i], value[i] = map(int, input().split())

for i in range(n):
    for j in range(k,-1,-1):
        if j - weight[i] >= 0 : 
            dp[j] = max(dp[j], dp[j-weight[i]] + value[i])

print(max(dp))

@alstjr7437
Copy link
Member Author

@wkdghdwns199 μ €λŠ” 많이 ν’€μ–΄λ³΄λŠ”κ²Œ 닡인 것 κ°™λ„€μš”....

@alstjr7437 alstjr7437 merged commit a2bf9b1 into main Feb 16, 2024
@alstjr7437 alstjr7437 deleted the 8-alstjr7437 branch February 26, 2024 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants