-
1차원 dp를 사용할 땐, 중복 갱신에 주의해야 함(경우에 따라 역순으로 갱신할것)실수모음 2023. 8. 28. 14:29
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
잘못된 코드(19번째 줄에서 dp[w - weight] 이라서 역순으로 갱신해야 함)
1234567891011121314151617181920212223242526#include <bits/stdc++.h>#define endl '\n' // don't use when you cover interactive problemusing namespace std;typedef pair<int, int> pi;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int N, K; cin >> N >> K;vector<pi> vec(N); // {weight, value}for(auto&[weight, val]: vec) cin >> weight >> val;vector<int> dp(K+1, 0);for(int i = 0; i < N; i++){auto& [weight, val] = vec[i];for(int w = weight; w <= K; w++){dp[w] = max(dp[w], dp[w-weight]+val);}}cout << dp[K] << endl;return 0;}cs올바른 코드
1234567891011121314151617181920212223242526#include <bits/stdc++.h>#define endl '\n' // don't use when you cover interactive problemusing namespace std;typedef pair<int, int> pi;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int N, K; cin >> N >> K;vector<pi> vec(N); // {weight, value}for(auto&[weight, val]: vec) cin >> weight >> val;vector<int> dp(K+1, 0);for(int i = 0; i < N; i++){auto& [weight, val] = vec[i];for(int w = K; w >= weight; w--){dp[w] = max(dp[w], dp[w-weight]+val);}}cout << dp[K] << endl;return 0;}cs반례
2 4
1 1
2 2이를 굉장히 잘 설명한 블로그 게시글(https://www.acmicpc.net/problem/2629)
dp의 out edge에 주목해서 코딩하였다.백준 2629번: 양팔저울 - 냅색(배낭) 문제
https://www.acmicpc.net/problem/2629 2629번: 양팔저울 첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은
dingcoding.tistory.com
이 글에서 빠진 논리가 하나 있는데
1차원 dp에서 이전 dp의 값(현재가 i번째 추를 사용할 때 dp값 갱신이라면 i-1번째 추까지 사용했을 때의 dp값을 의미)을 사용해야 하는데
if(dy[j]) dy[abs(j-chu[i])] = 1 ... ⓐ
으로 갱신할 때, 이전 dp의 값을 사용하는 것이 아닌
if(dy[j]) dy[j+chu[i]] = 1 ... ⓑ
ⓑ 갱신을 거친 dp의 값을 사용해도 답이 올바르게 도출되는지는 설명되어 있지 않다.(왜 가능하지 설명해보자. )
ⓐ, ⓑ의 코드 순서를 바꾸면 답이 틀린다
'실수모음' 카테고리의 다른 글
지문을 멋대로 해석해버린 예시 (0) 2023.09.22 [c++] round(-0.3)은 -0을 출력한다. 조심할 것 (0) 2023.09.05 코딩 할 때가 아닌 것 같은데?? (0) 2023.03.03 [python] round 는 당신이 알고 있는 반올림이 아닙니다 (0) 2023.01.14 [c++] cin 실패 (0) 2022.12.26