[BOJ 5550] 헌책방

2023. 4. 20. 10:05Baekjoon

728x90

https://www.acmicpc.net/problem/5550

 

5550번: 헌책방

상근이가 살고있는 도시에는 헌책방이 있다. 데이트 비용을 점점 감당할 수 없게된 상근이는 집에 있는 책을 헌책방에 팔려고 한다. 각 책에는 기준 가격이 정해져있고, 헌책방은 이 가격으로

www.acmicpc.net

 

- 문제 요약

 

상근이가 살고 있는 도시에는 헌책방이 있다.

각 책에는 기준 가격이 정해져 있고, 헌책방은 이 가격으로 매입한다.

헌책방은 책을 소설, 만화, 잡지등 10개의 장르로 분류한다. (1부터 10까지)

이 가게는 같은 장르의 책을 한 번에 매입할 때, 고가로 매입해 준다.

같은 장르의 책을 T권 매입할 때, 책 한 권 당 매입 가격이 기준 가격보다 T-1원 높아진다.

상근이는 가지고 있는 책 N권 중 K권을 팔려고 한다.

책 N권의 기준 가격과 장르 번호가 주어졌을 때, 총 매입 가격의 최댓값을 구하는 프로그램을 작성하시오.

 

 

- 알고리즘 정리

 

dp[x] : x권을 선택했을 때 만들 수 있는 최대 가격

dp[cnt+j]=max(dp[cnt+j],dp[cnt]+w[j-1]+(j-1)*j)

=> j개의 책을 추가로 고르는 경우에 현재 dp table의 값이 최대인지 확인한 후, 갱신 + 값 채워주기

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 2001
int n,k,dp[MAX];
vector<int>v[11],sum[11];

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>k;
	for(int i=0;i<n;i++){
		int a,b;
		cin>>a>>b;
		v[b].push_back(a);
	}
	for(auto &w:v){
		sort(w.begin(),w.end(),greater<>());
	}
	for(int i=1;i<=10;i++){
		auto w=v[i];
		sum[i].resize(w.size());
		for(int j=0;j<w.size();j++){
			sum[i][j]=(j?sum[i][j-1]:0)+w[j];
		}
	}
	for(auto &w:sum){
		for(int cnt=k;cnt>=0;cnt--){
			for(int j=1;j<=w.size();j++){
				if(cnt+j>k){
					break;
				}
				if(!cnt||dp[cnt]){
					dp[cnt+j]=max(dp[cnt+j],dp[cnt]+w[j-1]+(j-1)*j);
				}	
			}
		}
	}
	cout << dp[k];
}

코드 제출 결과

 

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 17611] 직각다각형  (1) 2023.04.21
[BOJ 10937] 두부 모판 자르기  (1) 2023.04.20
[BOJ 13560] 축구 게임  (0) 2023.04.19
[BOJ 10775] 공항  (0) 2023.04.18
[BOJ 9177] 단어 섞기  (0) 2023.04.14