Pagini recente » Cod sursa (job #2092418) | Cod sursa (job #1670201) | Cod sursa (job #2462066) | Monitorul de evaluare | Cod sursa (job #2952228)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define INF 2000000000
using namespace std;
ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");
int n , G , gmax , nmin = INF;
int v[20001];
int dp[20001][20001];
vector < int > ans;
///dp[i][j] - numarul minim de obiecte din primele i cu care se pot umple j grame din ghiozdan
void init(){
for(int i = 0 ; i <= n ; ++i)
for(int j = 1 ; j <= G ; ++j)
dp[i][j] = INF;
}
int main()
{
f >> n >> G;
for(int i = 1 ; i <= n ; ++i)
f >> v[i];
init();
for(int i = 1 ; i <= n ; ++i)
for(int j = 0 ; j <= G ; ++j){
dp[i][j] = dp[i - 1][j];
if(j >= v[i] && dp[i][j] > dp[i - 1][j - v[i]] + 1)
dp[i][j] = dp[i - 1][j - v[i]] + 1;
if(dp[i][j] != 0 && dp[i][j] != INF && j > gmax)
gmax = j , nmin = INF;
if(dp[i][j] != 0 && dp[i][j] != INF && j == gmax && nmin > dp[i][j])
nmin = dp[i][j];
}
g << gmax << " " << nmin << "\n";
while(nmin > 0){
for(int i = 1 ; i <= n ; ++i){
if(gmax - v[i] >= 0 && dp[n][gmax - v[i]] == nmin - 1){
gmax -= v[i];
--nmin;
ans.push_back(v[i]);
break;
}
}
}
sort(ans.begin() , ans.end());
for(auto it : ans)
g << it << "\n";
return 0;
}