1999291 | 2006-08-04 22:51:44 | Accepted | 1366 | C++ | 00:01.23 | 1176K | St.Crux |
终于又ac了一题.....最近几天我被淹没在绿色的wrong answer里。
『这个题很经典』hysbz的admin如是说。但我还是用不那么经典的办法.....用了两个数组,一个存标志位一个存数据。那个排序可有可无。
#include <cstdio>
#include <string>
int a[100001], b[100001], c, n, mx;
int ni[10], di[10];
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d", &c) != EOF)
{
int i, k, j;
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
scanf("%d %d", &ni[i], &di[i]);
}
for(i = 0; i < n - 1; i ++)
{
int j = i, t0 = di[i], t1 = ni[i];
for(k = i + 1; k < n; k ++)
{
if(t0 > di[k])
{
j = k; t0 = di[k];
}
}
di[j] = di[i]; di[i] = t0; ni[i] = ni[j]; ni[j] = t1;
}
//pt();
mx = 0;
memset(a, 0, sizeof(a));
b[0] = 0;
int pi = 1, ti; // index for b[]....vector.
for(i = 0; i < n; i ++)
{
ti = pi;
for(j = 0; j < pi; j ++)
{
for(k = 0; k <= ni[i]; k ++)
{
int t = b[j] + di[i] * k;
if(t <= c)
{
if(a[t]) continue;
a[t] = 1;
b[ti ++] = t;
if(t == c)
goto out;
}
}
}
pi = ti;
}
out:
for(i = c; i >= 0; i --)
{
if(a[i])
{
mx = i;
break;
}
}
printf("%d\n", mx);
}
return 0;
}
评论