Algorithm
Algorithm) SWEA 3282 0 / 1 knapsack
행복하고 싶은 사람
2023. 1. 31. 22:55
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBJAVpqrzQDFAWr
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
유명한 문제죠?
처음에 딱 보고 바로 백트래킹이 떠올랐지만 최대 입력이 1000개이기에 dp를 썼습니다!
#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T;
cin>>T;
for(test_case = 1; test_case <= T; ++test_case)
{
int arr[102][102] = {0};
int dp[102][1002] = {0};
int n,k;
int ans = 0;
cin >> n >> k;
for(int i=1; i<=n; i++) {
int v,c;
cin>>v>>c;
arr[i][0] = v;
arr[i][1] = c;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=k; j++){
int weight = arr[i][0];
int value = arr[i][1];
if(j < weight) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight] + value);
}
}
}
cout<<"#"<<test_case<<" "<<dp[n][k]<<"\n";
}
return 0;
}