Pagini recente » Cod sursa (job #2249508) | Cod sursa (job #2921533) | Cod sursa (job #370646) | Cod sursa (job #1323797) | Cod sursa (job #2407537)
#include<bits/stdc++.h>
using namespace std;
ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");
int N, W;
int frq[202];
int dp[80002], fw[80002], prv[80002];
bool gg[80002];
vector<int>ans;
int ct = -1;
int main()
{
f >> N >> W;
for(int i = 1; i <= N; ++i)
{
int x;
f >> x;
frq[x]++;
}
gg[0] = 1;
for(int i = 1; i <= 200; ++i)
{
int mmx = 0;
int noo = 0;
int val = 0;
for(int q = 0; q <= W; ++q)
{
if(!gg[q])
continue;
int mxx = min(frq[i], (W - q) / i);
if(mxx * i + q > mmx)
mmx = mxx * i + q, noo = mxx, val = dp[q] + mxx;
else
if(mxx * i + q == mmx && dp[q] + mxx < val)
mmx = mxx * i + q, noo = mxx, val = dp[q] + mxx;
}
int j = mmx;
if(ct < j || (ct == j && val < ans.size()))
{
ans.clear();
for(int r = 0; r < noo; ++r)
ans.push_back(i);
ct = j;
j = j - noo * i;
while(j)
{
for(int q = 1; q <= dp[j] - dp[fw[j]]; ++q)
ans.push_back((j - fw[j]) / (dp[j] - dp[fw[j]]));
j = fw[j];
}
}
int qt = 1;
while(frq[i])
{
int nc = 0;
if(frq[i] >= qt)
nc = qt, frq[i] -= qt;
else
nc = frq[i], frq[i] = 0;
for(int j = W - i * nc; j >= 0; --j)
if(gg[j] && (!gg[j + i * nc] || dp[j] + nc < dp[j + i * nc]))
{
gg[j + i * nc] = 1;
dp[j + i * nc] = dp[j] + nc;
fw[j + i * nc] = j;
}
qt *= 2;
}
}
g << ct << " " << ans.size() << '\n';
for(int i = 0; i < ans.size(); ++i)
g << ans[i] << '\n';
return 0;
}