일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 크루스칼
- 위상정렬
- 좌표압축
- 누적합
- 비트마스크
- 삼분탐색
- 다익스트라
- 이분탐색
- DP
- 그리디
- lca
- dfs
- 에라토스테네스의 체
- 구현
- BFS
- 펜윅트리
- 이진탐색
- 세그먼트트리
- MST
- DisjointSet
- 플로이드와샬
- 정렬
- 백준
- 이분매칭
- 브루트포스
- 수학
- LazyPropagation
- boj
- 투포인터
- lis
Archives
- Today
- Total
lastknight00
[백준]기업투자(2662) 본문
문제 링크 : [백준]기업투자(2662)
문제 설명
기업별로 투자 금액 별 수익금이 주어집니다.
N원을 투자하여 최대로 수익을 얻을 수 있는 금액과 어떤 기업에 얼마를 투자해야 하는지 구하세요.
입력
N(투재 금액, 1 <= N <= 300)
M(기업 갯수, 1 <= M <= 20)
A Bi(투자 정보, O원을 Bi기업에 투자하였을 때의 수익)
4 2
1 5 1
2 6 5
3 7 9
4 10 15
출력
15
0 4
카테고리
#DP
시간 복잡도 상한
O(M2N)
해결 방법
- 특정 금액으로 최대 수익을 얻어야 하는 문제입니다.
- DP[i][j] = i번째 기업까지 j원을 투자하여 얻을 수 있는 최대 수익금이라고 정의하면
- DP[i][j] = max(DP[i-1][j-k]+B[i][k])(0 < k < j) 로 구할 수 있습니다.
- 그러나 이것뿐만 아니라 어떤 기업에 얼마를 투자해야하는지를 알아야 합니다.
- DP[i][j]를 구할 때, k의 값을 저장합니다.
- 즉 i번째 기업까지 j원을 투자하여 최대 금액을 얻는 상황에서 i번째 기업에 얼마를 투자해야 하는지 저장합니다.
- 이 정보를 가지고, 역추적하여 출력하면 됩니다.
시간복잡도
O(MN2)
코드
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,d[21][301],e[21][301],v[21][301],i,j,k,s,a[21];
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){scanf("%*d");for(j=1;j<=m;j++)scanf("%d",d[j]+i);}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
for(k=0;k<=j;k++){
if(e[i][j]<e[i-1][j-k]+d[i][k]){
e[i][j]=e[i-1][j-k]+d[i][k];
v[i][j]=k;
}
}
}
}
printf("%d\n",e[m][n]);
for(j=n,i=m;i;i--){
a[i]=v[i][j];
j-=v[i][j];
}
for(i=1;i<=m;i++)printf("%d ",a[i]);
}
'PS' 카테고리의 다른 글
[백준]평균값 수열(5485) (3) | 2020.10.02 |
---|---|
[백준]무한이진트리(2078) (0) | 2020.10.02 |
[백준]대한민국(3770) (0) | 2020.09.27 |
[백준]소가 길을 건너간 이유 11(14459) (0) | 2020.09.22 |
[백준]우체국(2285) (0) | 2020.09.13 |
Comments