Pagini recente » Cod sursa (job #1629649) | Cod sursa (job #181135) | Cod sursa (job #3122026) | Cod sursa (job #2702973) | Cod sursa (job #1963409)
///dp[i]-numarul minim de obiecte pt a obtine suma i
///last[i]-greutatea ultimului obiect pus pt a obtine suma i
#include <bits/stdc++.h>
using namespace std;
int n,G,i,x,ap[210],last[75010],dp[75010],j,k;
int main()
{
ifstream f ("ghiozdan.in");
ofstream g ("ghiozdan.out");
f>>n>>G;
for(i=1; i<=n; ++i)
{
f>>x;
ap[x]++;
}
dp[0]=1;
for(i=200; i>=1; i--)
if(ap[i])
for(j=G-i; j>=0; --j)
if(dp[j])
for(k=1; k<=ap[i]; ++k)
{
if(j+k*i>G||dp[j+k*i])break;
dp[j+k*i]=dp[j]+k;
last[j+k*i]=i;
}
for(i=G; i>=1; --i)
if(dp[i])
{
g<<i<<" "<<dp[i]-1<<'\n';
while(i)
{
g<<last[i]<<'\n';
i-=last[i];
}
return 0;
}
return 0;
}