2016.03.24 모임 51

지난 주에 이어 계속 됩니다.

  • 활동 일시: 03월 24일 (목) 18:32 - 20:30
  • 모임 장소: 강남 R&D 캠퍼스 1층 회의실
  • 활동 주제: dynamic programming

문제 링크

  1. 알고스팟 SUSHI
  2. Processing Queries

오답이 SUSHI 나오는 소스코드 입니다.

#include <iostream>

using namespace std;

int n, m;
long long price[20], sat[20];
long long memo[201] = { 0, }  ; // 0 ~ 200

void calc() {
    for (int i = 1; i <= m; i++) {
        long long temp = 0;

        for (int j = 0; j < n; j++) {
            if (0 <= i-price[j]) {
                temp = memo[(i-price[j]) % 201] + sat[j];
            }
            memo[i % 201] = max(memo[i % 201], temp);
        }
    }
}

int main() {
    int t; cin >> t;
    while (t--) {
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            cin >> price[i] >> sat[i];
            price[i] /= 100;
        }
        m /= 100;

        calc();
        cout << memo[m % 201] << endl;
    }
    return 0;
}

memo 를 초기화 해 주니까 답이 나오는군요 @.@

#include <iostream>

using namespace std;

const int SIZE = 0xFF;

int n, m;
int price[20], sat[20];
int memo[SIZE] = { 0, }  ; // 0 ~ 200

void calc() {
    memo[0] = 0;
    int best = 0;
    for (int i = 1; i <= m; i++) {
        int &now = memo[i & SIZE];
        now = 0;
        for (int j = 0; j < n; j++) {
            if (0 <= i-price[j]) {
                int temp = memo[(i-price[j]) & SIZE] + sat[j];
                now = max(now, temp);
            }
        }
        best = max(best, now);
    }
    cout << best << endl;
}

int main() {
    int t; cin >> t;
    while (t--) {
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            cin >> price[i] >> sat[i];
            price[i] /= 100;
        }
        m /= 100;

        calc();
    }
    return 0;
}

사진

사진


Written on March 11, 2016