(문제 소스)
https://school.programmers.co.kr/learn/courses/30/lessons/12985#
1. 문제
설명
n개의 자연수의 중복집합(다집합, 이하 편의상 총칭하여 “집합”이라 함) 중에서 다음 두 가지 조건을 만족하는 집합을 최적집합이라 한다.
- 각 요소의 합이 S인 숫자 집합
- 위의 조건을 만족하면서 각 원소의 곱이 최대가 되는 집합
예를 들어, 2개의 자연수 집합에는 합이 9인 4개의 집합이 있습니다.
{1, 8}, {2, 7}, {3, 6}, {4, 5}
그 중 각 원소의 곱이 가장 큰 {4,5}가 가장 좋은 집합이다.
세트의 요소 수인 n과 모든 요소의 합인 s를 매개변수로 주어 최적의 세트를 반환하는 solve 함수를 완성합니다.
제한
- 최고의 문장 오름차순으로 정렬된 1차원 배열(리스트, 벡터) 로 돌아가주세요
- 베스트 세트가 없을 때 크기가 1인 1차원 배열(목록, 벡터) 에게 -하나 작성하여 반송해 주십시오.
- 자연수 n은 1에서 10,000 사이의 자연수이다.
- 모든 요소의 합 s는 1보다 크거나 같고 100,000,000보다 작거나 같은 자연수입니다.
I/O 예시

I/O 예시 설명
I/O 예제 #1
문제의 예와 같습니다.
I/O 예제 #2
합이 1인 두 개의 자연수 집합을 만들 수 없습니다. 따라서 -1을 포함하는 배열을 반환합니다.
I/O 예제 #3
합이 8인 두 자연수의 집합은 다음과 같습니다.
{1, 7}, {2, 6}, {3, 5}, {4, 4}
그 중 각 원소의 곱이 가장 큰 { 4, 4 }가 가장 좋은 집합이다.
2. 설명
원소들의 곱이 최대가 되기 위해서는 9(4.5)의 경우와 마찬가지로 n=2일 때 최대한 중앙에 가깝게 모은 값들의 곱이 가장 큰 것을 알 수 있었다. 8의 경우(4.4). 따라서 위의 예에서 9/2를 수행하면 몫이 4가 되고, (9-4)/1을 수행하면 5가 얻어 만족을 확인한다.
n이 s보다 크면 원하는 수를 만들 수 없으므로 -1이 반환됩니다.
조건이 n > 0이면 wild 문이 실행되었습니다.
먼저 s/n 값을 입력합니다. 그 다음 나는 내가 누른 만큼 s를 빼고 나머지 계산을 하기 위해 n–를 주었다.
3. 코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, int s) {
vector<int> answer;
if(n>s){
answer.push_back(-1);
return answer;
}
while(n>0){
answer.push_back(s/n);
s-=s/n;
n--;
}
return answer;
}