일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BFS
- back propagation
- 조합론
- c++
- 2023
- pytorch
- 백트래킹
- 알고리즘
- DP
- 세그먼트 트리
- 문자열
- 회고록
- 가끔은 말로
- 다익스트라
- 플로이드 와샬
- 크루스칼
- 너비 우선 탐색
- dropout
- NEXT
- lazy propagation
- 자바스크립트
- Overfitting
- 가끔은_말로
- object detection
- tensorflow
- dfs
- 이분 탐색
- 미래는_현재와_과거로
- 우선 순위 큐
- 분할 정복
Archives
- Today
- Total
Doby's Lab
백준 12865번: 평범한 배낭 (C++) 본문
https://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
Solved By: Knapsack DP
처음으로 시도해본 Knapsack DP문제입니다. 이론을 공부하면서 코드를 써봤는데 아직 완전히 이해되지는 않았습니다.
각 아이템 당 무게와 가치는 pair형 배열을 선언하여 저장해주었습니다.
#include <iostream>
using namespace std;
int n, k;
int cache[101][100001]; // 물품의 최대 개수 = 100개, 준서가 버틸 수 있는 최대 무게 100000
pair<int, int> item[101];
int main(){
cin >> n >> k;
for(int i = 1; i <= n; i++){
// first == 무게, second = 가치
cin >> item[i].first >> item[i].second;
}
for(int i = 1; i <= n; i++){ // 각 보석에 대하여
for(int j = 1; j <= k; j++){ // 최대 제한 무게가 j이 일 때
if(item[i].first <= j){
// 현재 아이템 무게에 대하여 넣을 수 있을 때
// 1) 넣지 않는다.
// 전 아이템을 넣고, 무게 배낭 한도가 j였을 때의 최대 이익 값을 가져온다.
// => cache[i - 1][j]
// 2) 넣지 않은 것보다 현재 물건을 넣은 것이 더 좋은 경우
// => item[i].second + cache[i - 1][j - item[i].first]
// == 현재 아이템의 가치 + 이전까지 물건을 넣었고, 무게 한도가 j - weight(i)일 때
cache[i][j] = max(cache[i - 1][j], item[i].second + cache[i - 1][j - item[i].first]);
}
else{
cache[i][j] = cache[i - 1][j];
}
}
}
cout << cache[n][k];
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 16943번: 최대 페이지 수 (C++) (0) | 2022.06.29 |
---|---|
백준 1535번: 안녕 (C++) (0) | 2022.06.29 |
백준 20301번: 반전 요세푸스 (C++) (0) | 2022.06.27 |
백준 24262번: 알고리즘 수업 - 알고리즘의 수행 시간 1 (C++) (0) | 2022.06.26 |
백준 13905번: 세부 (C++) (0) | 2022.06.26 |