티스토리 뷰

Algorithm/SW Expert Academy

3282 0/1 Knapsack

henry1214 2018. 4. 12. 03:59

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBJAVpqrzQDFAWr



d[i][j] = 가방의 크기가 i일 때 j번째 물건까지 담을 수 있는 최대 가치


1. 가방의 크기가 i일 때 j번째 물건을 담을 수 있다면 j번째 물건을 담는 경우와 아닌 경우 중 최대값으로 채운다.

     d[i][j] = max(d[i][j-1],d[i-v[j]][j-1]+c[j])


2. 가방의 크기가 i일 때 j번째 물건을 담을 수 없다면 j-1번째 물건까지 담을 수 있는 최대 가치로 채운다.

     d[i][j] = d[i][j-1]



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
#include <cstdio>
#include <algorithm>
using namespace std;
 
int t,n,k,v[101],c[101],d[1001][101];
 
int main()
{
    scanf("%d",&t);
    for(int T=1;T<=t;T++)
    {
        scanf("%d %d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d %d",&v[i],&c[i]);
        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i>=v[j]) d[i][j]=max(d[i][j-1],d[i-v[j]][j-1]+c[j]);
                else d[i][j]=d[i][j-1];
            }
        }
        printf("#%d %d\n",T,d[k][n]);
    }
    return 0;
}
cs

    

'Algorithm > SW Expert Academy' 카테고리의 다른 글

1868 파핑파핑 지뢰찾기  (0) 2018.09.05
4530 극한의 청소 직업  (0) 2018.09.04
3260 두 수의 덧셈  (0) 2018.04.11
3304 최장 공통 부분 수열  (0) 2018.04.11
3307 최장 증가 부분 수열  (0) 2018.04.11
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday