Pagini recente » Cod sursa (job #2686641) | Cod sursa (job #1688022) | Cod sursa (job #128816) | Cod sursa (job #1863197) | Cod sursa (job #1410432)
#include <fstream>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
const int INF = 0x3f3f3f3f;
int N, G;
int V[205], TT[75005], ap[75005];
int dp[75005]; // dp[i] - numarul minim de obiecte avand greutatea i
int main()
{
fin >> N >> G;
for (int i = 1, x; i <= N; ++i)
{
fin >> x;
++V[x];
}
for (int i = 1; i <= 75000; ++i)
dp[i] = INF;
for (int gr = 200; gr >= 0; --gr)
{
if (!V[gr])
continue;
for (int j = G; j >= gr; --j)
{
for (int i = 1; i <= V[gr] && i * gr <= j; ++i)
if (dp[j - i * gr] != INF)
{
if (dp[j - i * gr] + i <= dp[j] && ap[j] + i <= V[gr])
{
dp[j] = dp[j - i * gr] + i;
ap[j - i * gr] = i;
TT[j] = gr;
}
}
}
//dp[j] = min(dp[j], dp[j - i * gr] + i);
}
for (int gr = G; gr >= 0; --gr)
if (dp[gr] != INF)
{
fout << gr << ' ' << dp[gr] << '\n';
while (gr)
{
fout << TT[gr] << '\n';
gr -= TT[gr];
}
break;
}
fin.close();
fout.close();
return 0;
}