
간단한 해설
1차원 dp로 해결
밑이랑 비슷한 방식
백준 1106 호텔 C++
2차원 dp로 할려다가, 기존의 배낭문제처럼 최댓값을 이어서 받는 것은 고객 수의 idx가 배수가 아닐 경우, 문제가 생겨서 1차원 dp로 해결하였다. 주석을 상세히 다시 달아보았다. 적어도 c명 이상
ash9river.tistory.com
답
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n,k;
cin>>n>>k;
vector<int> v(n);
for(int i=0;i<n;++i){
cin>>v[i];
}
sort(v.begin(),v.end());
vector<int> dp(k+1,987654321);
for(int i=0;i<n;++i){
if(v[i]>k) continue;
dp[v[i]]=1;
for(int j=2*dp[i];j<=k;j+=dp[i]){
dp[j]=min(dp[j],dp[j-dp[v[i]]]+1);
}
}
for(int i=0;i<=k;++i){
for(int j=0;j<=i;++j){
dp[i]=min(dp[i],dp[i-j]+dp[j]);
}
}
if(dp[k]==987654321) dp[k]=-1;
cout<<dp[k];
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1956 운동 C++ (0) | 2024.10.06 |
---|---|
백준 17069 파이프 옮기기 2 C++ (2) | 2024.10.02 |
백준 14502 연구소 C++ (4) | 2024.09.26 |
백준 17141 연구소 2 c++ (1) | 2024.09.25 |
백준 17485 진우의 달 여행 (Large) C++ (0) | 2024.09.25 |