본문 바로가기

Problem Solving/문제풀이

[BOJ] 7579 앱

나는 사용가능한 최대 cost를 정해두고 0/1 knapsack을 돌리는걸 파라메트릭 서치로 해서 AC를 받았는데 보니까 아무도 이렇게 풀지 않았다 ㅠㅠ 억울해서 소스를 올린다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
 
using namespace std;
 
int n,m;
int arr[105];
int cost[105];
int cache[105][10005];
 
int dp(int idx, int remain)
{
    if(idx==(n+1)) return 0;
    int& ret=cache[idx][remain];
    if(ret!=-1return ret;
 
    int ma=dp(idx+1,remain);
    if(remain>=cost[idx]) ma=max(ma,dp(idx+1,remain-cost[idx])+arr[idx]);
    return ret=ma;
}
 
bool isAvail(int goal)
{
    memset(cache,-1,sizeof(cache));
    if(dp(1,goal)>=m) return true;
    else return false;
}
 
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&arr[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&cost[i]);
    int le=0,ri=10000,mid,ans=10000;
    while(le<=ri)
    {
        int mid=(le+ri)>>1;
        if(isAvail(mid))
        {
            ans=min(ans,mid);
            ri=mid-1;
        }
        else
            le=mid+1;
    }
    printf("%d",ans);
    return 0;
}
 
cs

'Problem Solving > 문제풀이' 카테고리의 다른 글

[BOJ] 15977 조화로운 행렬  (1) 2018.09.28
[BOJ] 11377 열혈강호 3  (0) 2018.09.21
[BOJ] 2629 양팔저울  (0) 2018.09.06
NYPC 예선 후기  (1) 2018.08.31
[BOJ] 10840 구간 성분  (0) 2018.07.19