Nu aveti permisiuni pentru a descarca fisierul grader_test14.ok
Cod sursa(job #1410461)
Utilizator | Data | 31 martie 2015 02:34:19 | |
---|---|---|---|
Problema | Ghiozdan | Scor | 90 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.47 kb |
#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], nr[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 i = 0; i <= 75000; ++i)
ap[i] = 0;
for (int j = G; j >= gr; --j)
{
for (int i = 1; ap[j] + i <= V[gr] && i * gr <= j; ++i)
if (dp[j - i * gr] != INF)
{
if (dp[j - i * gr] + i <= dp[j])
{
dp[j] = dp[j - i * gr] + i;
ap[j - i * gr] = i;
TT[j] = gr;
nr[j] = i;
}
}
}
}
for (int gr = G; gr >= 0; --gr)
if (dp[gr] != INF)
{
fout << gr << ' ' << dp[gr] << '\n';
while (gr)
{
for (int i = 1; i <= nr[gr]; ++i)
fout << TT[gr] << '\n';
gr -= nr[gr] * TT[gr];
}
break;
}
fin.close();
fout.close();
return 0;
}