반응형
Notice
Recent Posts
Recent Comments
Link
뜌릅
평범한 배낭 백준 - 12865번 본문
반응형
이 문제는 knapsack유형의 문제라고 한다. 나는 이 문제를 처음 봤지만, 풀는데에 구글링을 해서 솔루션을 보았기에, 앞으로 dp유형과 knapsack유형이 익숙해질때까지 많이 풀고자 한다.

어느 dp문제가 그렇듯이, 점화식을 작성해야 한다. 처음 이 문제를 접했을 때, 기준점을 잡기가 어려웠다. 하지만, 구글링을 하게 된 결과, 기준은 내가 정하게 되는거란 것을 알게 되었다. 나는 기준을 입력순대로 정하였다.
이 기준대로, 물건의 종류를 처음에는1개에서 2개, ....... n개까지 1개씩 증가시키면서 그때마다의 최댓값을 얻어냈다.
1개일 때의 최댓값을 구하는건 쉽다. 무게보다 낮을경우 0, 높을 경우 해당 물건의 무게값.
k개일 때의 최댓값은 k-1개일 때의 최댓값에서 k번째 물건을 추가시킨 경우의 최댓값이다.
k+1개일 때의 최댓값 역시 k개일 때의 최댓값에서 k+1번째 물건을 추가시킨 경우의 최댓값일 것이다.
좀더 쉽게 풀기위해, 이렇게 쓰고보니, 수학적 귀납법의 꼴이 완성 되어 있었다.
그렇게 하여, 문제를 풀게 되었다.
#import<bits/stdc++.h>
using namespace std;
#define fast_io ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define rep(i, j) for(int i=0;i<j;i++)
#define pii pair<int,int>
#define ff first
#define ss second
int n,k;
vector<vector<int>> dp(102,vector<int>(100003));
vector<pii> v(102);
void solve(){
cin>>n>>k;
rep(i,n){
cin>>v[i].ff;
cin>>v[i].ss;
}
for(int i =0;i<n;i++){
int weight = v[i].ff;
int value = v[i].ss;
for(int j =0;j<=k;j++){
if(i>0) {
if(j<weight) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight] + value);
}
else {
if(j<weight) dp[i][j] =0;
else dp[i][j] = value;
}
}
}
cout<<dp[n-1][k];
}
int main() {
fast_io;
solve();
return 0;
}
반응형
'알고리즘 > PS 문제' 카테고리의 다른 글
파티 1238번 [백준] (0) | 2021.05.02 |
---|---|
Stickers 백준 - 9465번 (0) | 2021.03.15 |
트리의 부모 찾기 백준 - 11725번 (0) | 2021.03.13 |
LCS 백준 - 9251번 (0) | 2021.03.10 |
The Triangle 백준 - 1932번 (0) | 2021.03.08 |