#include <iostream> #include <vector> using namespace std; int arr[100]; int n,m; vector<int> v; int maxSum = 0; void comb(int n, int r, int index) { if(r == 0) { int sum = 0; for(int i=0;i<v.size();i++) sum += v[i]; if(sum <= m && sum > maxSum) maxSum = sum; return; } else if(n == r) { int sum = 0; for(int i=0;i<n;i++) v.push_back(arr[i+index]); for(int i=0;i<v.size();i++) sum += v[i]; if(sum <= m && sum > maxSum) maxSum = sum; for(int i=0;i<n;i++) v.pop_back(); return; } v.push_back(arr[index]); comb(n-1,r-1,index+1); v.pop_back(); comb(n-1,r,index+1); return; } int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&arr[i]); comb(n,3,0); printf("%d",maxSum); }

N<=100이여서 조합으로 풀 수 있을것 같다고 생각하여 조합을 이용해 해결하였습니다.

풀이과정은 조합 알고리즘에서 합이 m 이하이고 maxSum을 두어 m과 가장 가까운 수가 되도록 하는 원리를 적용한 것이기에 자세한 설명은 생략하겠습니다.


+ Recent posts