Pagini recente » Cod sursa (job #2137790) | Cod sursa (job #297771) | Cod sursa (job #14724) | Cod sursa (job #772001) | Cod sursa (job #578418)
Cod sursa(job #578418)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct pct{long x; long y;} a[10001];
long n, w, b[200001], x, d[200001], i, j, min = 99999999;
int compare(const void *a, const void *b)
{
pct x = *(pct*)a;
pct y = *(pct*)b;
if (x.y < y.y) return -1;
else if (x.y > y.y) return 1;
if (x.x < y.x) return -1;
else if (x.x > y.x) return -1;
return 0;
}
int main()
{
freopen("energii.in","r",stdin);
freopen("energii.out","w",stdout);
scanf("%ld", &n);
scanf("%ld", &w);
for (i = 1; i <= n; i ++)
scanf("%ld %ld", &a[i].x, &a[i].y);
qsort(a, n, sizeof(pct), compare);
memset(b + 1, -1, sizeof(b));
memset(d + 1, -1, sizeof(d));
for (i = 1; i <= n; i ++)
for (j = 0; j + a[i].x <= 20001; j ++)
if (b[j] < i && b[j + a[i].x] == -1 && b[j] != -1)
{
b[j + a[i].x] = i;
d[j + a[i].x] = d[j] + a[i].y;
}
// else if (b[j] < i && d[j + a[i].x] > d[b[j]] + a[i].y)
// {
// d[j + a[i].x] = d[b[j]] + a[i].y;
// }
j = w;
for (j = w; j <= 100001; j ++)
if (d[j] < min && d[j] != -1)
{min = d[j];x = j;}
if (min == 99999999) printf("-1\n");
else printf("%ld %ld\n", min, x);
return 0;
}