1일1알

백준 16194번 카드 구매하기 2 C++ 본문

알고리즘

백준 16194번 카드 구매하기 2 C++

영춘권의달인 2021. 12. 17. 12:18

출처 : https://www.acmicpc.net/problem/16194

 

https://kjhcocomi.tistory.com/11

 

백준 11052번 카드 구매하기 C++

한정된 공간 안에 최대한의 가치를 넣는 배낭 채우기와 비슷한 문제이다. 카드의 개수가 무게, 가격을 가치라고 생각하면 된다. 하지만 한가지 다른 점이 있는데, 한 종류의 카드팩을 여러번 살

kjhcocomi.tistory.com

이 문제와 유사한 문제이다. 금액의 최대가 아닌 최솟값을 구하면 된다.

여기서는 최솟값을 구해야 하기 때문에 초기값을 넣어주어야 한다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>

using namespace std;
typedef long long ll;

const int INF = 987654321;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n;
	cin >> n;
	vector<int> cards(n + 1);
	vector<vector<int>> dp(n + 1, vector<int>(n + 1, INF));
	dp[0][0] = 0;
	for (int i = 1; i <= n; i++) {
		cin >> cards[i];
		dp[1][i] = i * cards[1];
		dp[0][i] = 0;
		dp[i][0] = 0;
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (j - i < 0) {
				dp[i][j] = dp[i - 1][j];
			}
			else {
				dp[i][j] = min(dp[i][j - i] + cards[i], dp[i - 1][j]);
			}
		}
	}
	cout << dp[n][n];
};

'알고리즘' 카테고리의 다른 글

백준 3079번 입국심사 C++  (0) 2021.12.19
백준 15486 퇴사 2 C++  (0) 2021.12.18
백준 1495번 기타리스트 C++  (0) 2021.12.16
백준 2011번 암호코드 C++  (0) 2021.12.15
백준 1325번 효율적인 해킹 C++  (0) 2021.12.14