문제 설명
정보 선생님은 예산이 많은 부서에서 일하고 있다.
학기말이 가까워지면서 부서의 예산을 가급적 모두 집행해야 될 상황이 되었다.
정보 선생님은 예산 범위를 넘지 않는 범위 내에서 다양한 활동을 하고 싶어한다.
지금 남은 예산(B)이 40이고(단위:만원), 예산을 사용할 수 있는 활동(N)이 6개가 있다.
6개의 활동에 각각 드는 비용은 7, 13, 17, 19, 29, 31이다.
여기서 40을 채울 수 있는 활동의 개수는 상관이 없다.
40을 넘지 않는 범위에서 활동 비용을 조합해보면,
7 + 13 + 17 = 37
7 + 31 = 38
7 + 13 + 19 = 39
...
따라서 40을 초과하지 않으면서 예산을 최대로 사용할 수 있는 비용은 39이다.
정보 선생님을 도와 줄 수 있는 프로그램을 작성하시오.
입력
첫째 줄에 남은 예산(B)가 입력된다. ( 10 <= B <= 35,000 )
둘째 줄에 예산을 사용할 수 있는 활동의 수(N)이 입력된다. (1 <= N <= 21 )
셋째 줄에 공백을 기준으로 N개의 활동비가 양의 정수로 입력된다.
출력
남은 예산을 초과하지 않으면서 최대로 사용할 수 있는 비용액을 출력하시오.
입력 예시
40
6
7 13 17 19 29 31
출력 예시
39
나의 코드
#include <stdio.h>
int main() {
int b, n, num[21]; // 변수선언
int dp[35001] = {0}; // 배열 생성
scanf("%d", &b); // 입력
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]); // 입력
}
for (int i = 0; i < n; i++) {
for (int j = b; j >= num[i]; j--) {
// 비교하면서 최댓값 비교
dp[j] = (dp[j] > dp[j - num[i]] + num[i]) ? dp[j] : dp[j - num[i]] + num[i];
}
}
printf("%d\n", dp[b]); // 출력
return 0;
}
'알고리즘 공부 > CodeUp 문제풀이' 카테고리의 다른 글
코드업 1472:2차원 배열 지그재그 채우기 2-5(C) (0) | 2023.10.02 |
---|---|
코드업 1430:기억력 테스트 2(C) (2) | 2023.10.01 |
코드업 2016:천단위 구분기호(C) (0) | 2023.09.29 |
코드업 2008:오름차순? 내림차순? 2(C) (0) | 2023.09.28 |
코드업 3015:성적표 출력(C) (0) | 2023.09.27 |