// UVa 10163 - Storage Keepers // dynamic programming #include <iostream> #include <string.h> using namespace std; const int maxm = 30; const int maxn = 100; const int maxp = 1000; const int oo = maxm * maxp + 1; int main() { int n, m; while ((cin >> n >> m) && (n || m)) { // input int p[maxm]; for (int i = 0; i < m; i++) cin >> p[i]; // find L int L[maxn + 1]; memset(L, 0, sizeof(L)); L[0] = oo; for (int i = 0; i < m; i++) for (int j = n; j >= 1; j--) for (int k = 0; k < j; k++) { int newL = min(p[i] / (j - k), L[k]); if (newL > L[j]) L[j] = newL; } // find Y int T[maxn + 1]; if (L[n] == 0) T[n] = 0; else { memset(T, 127, sizeof(T)); T[0] = 0; for (int i = 0; i < m; i++) for (int j = n; j >= 1; j--) for (int k = 0; k < j; k++) if (min(p[i] / (j - k), L[k]) >= L[n] && T[k] + p[i] < T[j]) T[j] = T[k] + p[i]; } // output cout << L[n] << " " << T[n] << endl; } return 0; }
Monday, May 4, 2015
UVa 10163 - Storage Keepers
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment