https://www.acmicpc.net/problem/2798
DFS를 이용하여 완전탐색을 진행하면 된다.
문제가 구현으로 분류되어 있어 시뮬레이션 카테고리에 넣었는데
다음 순열등 다양한 방법으로 문제를 해결할 수 있다.
N개의 카드중에 3개를 고른 후에 M보다 크지않을때 최대값을 찾으면 답을 구할 수 있다.
N의 크기가 100이 최대 이기 때문에 O(N^3)의 시간안에 풀 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <iostream> #include <vector> using namespace std; int N,M; int ans=0; vector<int> vec; void dfs(int pos,int cnt,int sum){ if(cnt==3){ if(sum<=M) ans=max(ans,sum); return; } if(sum>M || pos>=N) return; dfs(pos+1,cnt+1,sum+vec[pos]); dfs(pos+1,cnt,sum); } int main() { cin>>N>>M; vec=vector<int> (N,0); for(int i=0;i<N;i++) scanf("%d",&vec[i]); dfs(0,0,0); cout<<ans<<endl; return 0; } | cs |
'알고리즘(BOJ) > 시뮬레이션' 카테고리의 다른 글
백준 1713번 - 후보 추천하기 (0) | 2019.05.05 |
---|---|
백준 1018번 - 체스판 다시 칠하기 (0) | 2019.04.28 |
백준 17135번 - 캐슬 디펜스 (0) | 2019.04.20 |
백준 1547번 - 공 (0) | 2019.03.26 |
백준 15685번 - 드래곤 커브 (0) | 2018.10.14 |