// 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