Pagini recente » Cod sursa (job #250006) | Cod sursa (job #1372457) | Cod sursa (job #863005) | Cod sursa (job #1346006) | Cod sursa (job #2408069)
#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 qt = 1;
int mmx = 0;
while(frq[i])
{
mmx = 0;
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]))
{
mmx = max(mmx, j + i * nc);
gg[j + i * nc] = 1;
dp[j + i * nc] = dp[j] + nc;
fw[j + i * nc] = j;
}
qt *= 2;
int j = mmx;
if(ct < j || (ct == j && dp[j] < ans.size()))
{
ans.clear();
ct = j;
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];
}
}
}
}
g << ct << " " << ans.size() << '\n';
for(int i = 0; i < ans.size(); ++i)
g << ans[i] << '\n';
return 0;
}