일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 카카오
- SSAFY 7기
- 코딩테스트 연습
- 구글
- 프로그래머스
- KT
- 신문스크랩
- python
- 네트워크 관리사 2급
- 코테
- 백준위
- 싸피
- 인앱결제
- 코딩테스트
- 리얼클래스
- html
- SSAFYcial
- it 뉴스
- 네트워크 관리사 2급 실기
- java 객체지향 프로그래밍
- 신문 스크랩
- Java
- SSAFY
- 싸피셜
- 우테코
- 네트워크 관리사
- IT 동향
- 백준
- it 이슈
- IT 트렌드
- Today
- Total
개발자일걸요..?
12865번 평범한 배낭 본문
문제링크 : www.acmicpc.net/problem/12865
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
<알고리즘>
1) 물건들의 무게와, 가치를 입력받은 후, 무게기준 오름차순으로 정렬
2) 무게당 넣을 수 있는 최대가치 계산을 위한 이차배열 dq를 생성
3) dq의 열은 0~K까지로 고려하는 무게, 행은 0~N까지로 고려의 대상이 되는 물건의 개수를 의미함
4) dq의 행=0인 경우 => 고려대상이 되는 물건의 개수가 0, 열=0인경우 => 가방에 담을 수 있는 무게가 0 이므로 dq의 행이나 열이 0인 경우는 가치도 0이다.
5) dq채우기
5-1) 지금 고려하는 물건의 무게가 내가 고려하는 칸의 무게보다 작으면, (1)과(2) 중 큰값고르기
(1) 그 물건의 가치 + (내가고려하는 칸의 무게-그 물건의 무게)가방의 최대가치
(2) 그 물건을 넣지 않았을 때의 가치
5-2) 지금 고려하는 물건의 무게가 내가 고려하는 칸의 무게보다 크면, 그 물건을 넣지 않았을 때의 가치 채택
6) dq[K][N]은 최대 N개의 물건까지 고려하고 최대 K무게 까지 고려했을때 가방에 담을 수 있는 최대 가치이므로 dq[N][K] 출력
메모리 : 42004KB 시간 : 52ms
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N = 0;
int K = 0;
cin >> N >> K;
vector<vector<int>> wv(N,vector<int>(2));
int v = 0;
int w = 0;
for (int i = 0; i < N; i++) {
cin >> w >> v;
wv[i][0] = w;
wv[i][1] = v;
}
sort(wv.begin(), wv.end());
vector<vector<int>> dq(N + 1, vector<int>(K + 1));
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= K; j++) {
if (i == 0 || j == 0) {
dq[i][j] = 0;
}
else if (wv[i - 1][0] <= j) {
dq[i][j] = max((wv[i - 1][1] + dq[i - 1][j - wv[i - 1][0]]), (dq[i - 1][j]));
}
else {
dq[i][j] = dq[i - 1][j];
}
}
}
cout << dq[N][K];
return 0;
}
+) 참고 : ko.wikipedia.org/wiki/%EB%B0%B0%EB%82%AD_%EB%AC%B8%EC%A0%9C
배낭 문제 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 배낭 문제(Knapsack Problem 냅색 프라블럼[*])는 조합 최적화의 유명한 문제이다. 간단하게 말하면, 한 여행가가 가지고 가는 배낭에 담을 수 있는 무게의 최댓값이
ko.wikipedia.org
+) 참고 : gsmesie692.tistory.com/113
Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem)
도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서
gsmesie692.tistory.com
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
2579번 계단오르기 (0) | 2021.03.24 |
---|---|
1912번 연속합 (0) | 2021.03.23 |
9251번 LCS (0) | 2021.03.19 |
2565번 전깃줄 (0) | 2021.03.18 |
11054번 가장 긴 바이토닉 부분 수열 (0) | 2021.03.16 |