Pagini recente » Cod sursa (job #256688) | Cod sursa (job #1335888) | Cod sursa (job #523971) | Cod sursa (job #2675940) | Cod sursa (job #2361181)
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 2.e9;
int v[20005] , ans[20005];
struct ghiozdan
{
int nr , last;
};
ghiozdan g[75005];
int main()
{
freopen("ghiozdan.in" , "r" , stdin);
freopen("ghiozdan.out" , "w" , stdout);
int n , gmax , i , j , last , aux , maxg , nmin , gasit;
scanf("%d%d" , &n , &gmax);
for(i = 1 ; i <= n ; i ++)
scanf("%d" , &v[i]);
for(i = 1 ; i <= gmax ; i ++)
g[i].nr = INF;
last = 0;
for(i = 1 ; i <= n ; i ++)
{
aux = 0;
for(j = last ; j >= 0 ; j --)
if(g[j + v[i]].nr > g[j].nr + 1)
{
g[j + v[i]].nr = g[j].nr + 1;
g[j + v[i]].last = i;
aux = max(aux , j + v[i]);
}
last = aux;
}
gasit = 0;
for(i = gmax ; i >= 1 ; i --)
{
if(g[i].nr != INF && gasit == 0)
{
maxg = i;
nmin = g[i].nr;
ans[++ ans[0]] = g[i].last;
aux = i - v[g[i].last];
gasit = 1;
}
else if(i == aux)
{
ans[++ ans[0]] = g[i].last;
aux = i - v[g[i].last];
}
//printf("%d %d %d\n" , i , g[i].nr , g[i].last);
}
printf("%d %d\n" , maxg , nmin);
for(i = 1 ; i <= ans[0] ; i ++)
printf("%d\n" , v[ans[i]]);
return 0;
}