BOJ 5375 - 공책 구매

image.png

26969 풀이 와 동일하게 풀 수 있는데 좀 더 쉬운 버전이다.

$p_i$ 에대한 오름차순으로 정렬해둔다면 정답이 되는 쇼핑몰을 모두 골랐을 때 앞에서부터 $s_i$ 를 모두 꽉 채워서 사는것이 최적이다.

$dp[i][j]=i$ 번 째 서점 전까지 $j$개를 사는 최소값

으로 정의하고 반복문 DP로 푼다.

int dp[101][10001];  
const int inf = 0x3f3f3f3f;  
void solve() {  
   int n, m;  
   cin >> n >> m;  
   memset(dp, inf, sizeof dp);  
   vector<shop> s(m);  
   for (int i = 0; i < m; i++) cin >> s[i].s >> s[i].p >> s[i].o;  
   sort(all(s), [&](auto &a, auto &b) { return a.p < b.p; });  
   dp[0][0] = 0;  
   for (int i = 0; i < m; i++) {  
      for (int j = 0; j <= n; j++) {  
         if (dp[i][j] == inf) continue;  
         dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]);  
         int buy = min(s[i].s, n - j);  
         dp[i + 1][j + buy] = min(dp[i + 1][j + buy], dp[i][j] + s[i].o + s[i].p * buy);  
      }  
   }  
   cout << dp[m][n] << endl;  
}

Tags:

Categories:

Updated:

Comments