백준/DP
[백준 1535] 안녕
mintuchel
2024. 2. 17. 17:12
얘도 dp문제임
01 배낭문제인 평범한 배낭 이 문제랑 똑같은 상황임
얘도 가치있는거부터 넣는다고 좋은게 절대 아님
greedy로 안풀림
greedy로 풀었을때의 반례를 보자면
총 10 담을 수 있는데
8 8
5 5
4 4
이렇게 있으면 5 4 조합 넣는게 훨씬 이득임
하지만 greedy로 풀면 8에서 끝남
그래서 dp로 풀어야함
greedy가 안먹히기 때문

#include <iostream>
#define SIZE 21
using namespace std;
int N;
int L[SIZE], J[SIZE];
int dp[SIZE][101];
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N;
for (int i = 1; i <= N; i++) cin >> L[i]; // 체력
for (int i = 1; i <= N; i++) cin >> J[i]; // 기쁨
for (int i = 1; i <= N; i++) {
for (int HP = 1; HP <= 100; HP++) {
// 인사할 수 있으면
if (HP - L[i] > 0) {
dp[i][HP] = max(dp[i - 1][HP], dp[i - 1][HP - L[i]] + J[i]);
}
// 인사 못하면
else {
dp[i][HP] = dp[i - 1][HP];
}
}
}
cout << dp[N][100];
return 0;
}