문제링크:www.acmicpc.net/problem/7579
7579번: 앱
입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활
www.acmicpc.net
배낭문제 알고리즘으로 해결하는 문제입니다.
근데 기존 배낭문제에서는 배낭에 넣을 수 있는 최대값을 구하잖아요?
근데 이문제는 최소 값을 구해야 하고 무게가 아닌 시간값을 구해야하는게 다른 문제입니다.
그래서 시간과 무게를 반대로 생각해서 점화식을 구현하는 문제입니다.
이 문제가 어려우시다면 아래 문제를 먼저 풀어보세요.
[백준] 12865-평범한 배낭(C++), 배낭 문제 알고리즘
문제링크: www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의..
gusdnr69.tistory.com
m[] 메모리 배열
c[] 비용 배열
dp[i][j] i는 n개의 앱 중에서 몇번째 앱까지인지 j는 시간을 의미합니다.
이때 dp에 저장되는 값은 메모리값이 저장됩니다.
점화식은
if(j >= c[i]) dp[i][j] = max(dp[i-1][j], dp[i -1][j- c[i]] +m[i])
else dp[i][j] = dp[i-1][j]
입니다.
dp[i][j] >= M 일때 min(result,j)를 통해서 결과값을 도출합니다.
아래는 정답코드입니다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, M;
int m[101] = { 0, };
int c[101] = { 0, };
int dp[101][10001] = { 0, };
int result = 1000000000;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++){
cin >> m[i];
}
for (int i = 1; i <= N; i++) {
cin >> c[i];
}
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= 10000; j++) {
if (c[i] <= j)
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - c[i]] + m[i]);
else
dp[i][j] = dp[i - 1][j];
if (dp[i][j] >= M) result = min(result, j);
}
}
cout << result << endl;
return 0;
}
'알고리즘 > DP' 카테고리의 다른 글
[백준] 2616-소형기관차(C++) (0) | 2020.12.21 |
---|---|
[백준] 17208-카우버거 알바생(C++), 배낭 문제 알고리즘 (0) | 2020.12.17 |
[백준] 12865-평범한 배낭(C++), 배낭 문제 알고리즘 (0) | 2020.12.17 |
[백준] 11062-카드 게임(C++) (0) | 2020.12.16 |
[백준] 1516-게임개발(C++) (0) | 2020.12.16 |