간단한 해설
1차원 dp로 해결
밑이랑 비슷한 방식
답
#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++ (0) | 2024.09.25 |
백준 17485 진우의 달 여행 (Large) C++ (0) | 2024.09.25 |