Pagini recente » Cod sursa (job #926536) | Cod sursa (job #905718) | Cod sursa (job #1976683) | Cod sursa (job #336111) | Cod sursa (job #3176760)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f( "ghiozdan.in" );
ofstream g( "ghiozdan.out" );
const int dim_capacit = 75005, dim_obiecte = 20002;
int n, greut[ dim_obiecte ], frecv[ 202 ], R;
int dp[ dim_capacit ];
int tata[ dim_capacit ];
int main()
{
int i, j, tinta, capacit;
f >> n >> R;
for( i = 1; i <= n; ++i )
f >> greut[ i ],
++frecv[ greut[i] ];
dp[ 0 ] = 1;
for( i = 200; i > 0; --i )
if(frecv[ i ] != 0 )
for( capacit = R; capacit >= 0; --capacit )
if( dp[ capacit ] != 0 )
{
tinta = min( frecv[ i ], (R - capacit) / i );
for (j = 1; j <= tinta; ++j)
{
if ( dp[j * i + capacit] != 0 )
break;
dp[ j * i + capacit ] = dp[ capacit ] + j;
tata[ j * i + capacit ] = i;
}
}
for( i = 1; i <= R; ++i )
if( dp[ i ] > 1 )
g << "Numarul minim de obiecte pentru greutatea " << i << " este: " << dp[ i ] - 1 << endl;
else
g << "Greutatea " << i << " NU poate fi formata cu niciun obiect." << endl;
i = R;
while( dp[ i ] == 0 )
--i;
g << i << " " << dp[ i ] - 1 << endl;
cout << "Din " << R << " pot umple " << i << " unitati, cu " << dp[ i ] - 1 << " obiecte. Apasa Enter." << endl;
while( --dp[ i ] )
{
g << tata[ i ] << endl;
i = i - tata[ i ];
}
return 0;
}