Cod sursa(job #2193518)

Utilizator flibiaVisanu Cristian flibia Data 10 aprilie 2018 14:05:14
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>

using namespace std;

ifstream in("ghiozdan.in");
ofstream out("ghiozdan.out");

int dp[75300], g[20100], nxt[75300], top[75300], n, G;

int main(){
	in >> n >> G;
	for(int i = 1; i <= n; i++)
		in >> g[i];
	sort(g + 1, g + n + 1);
	for(int i = n; i; i--){
		for(int w = G; w; w--)
//			if(dp[w] && (!dp[w + g[i]] || dp[w] + 1 < dp[w + g[i]])){
//				dp[w + g[i]] = dp[w] + 1;
//	//			top[w + g[i]] = g[i];
//	//			nxt[w + g[i]] = top[w];
//			}
			if(dp[w])
				if(!dp[w + g[i]] || dp[w] + 1 < dp[w + g[i]]){
					dp[w + g[i]] = dp[w] + 1;
					top[w + g[i]] = g[i];
					nxt[w + g[i]] = top[w];
				}
				else if(w + g[i] <= G) 
					break;	
		dp[g[i]] = 1;
		top[g[i]] = g[i];
	}
	for(int i = G; i; i--)
		if(dp[i]){
			out << i << ' ' << dp[i];
			out << '\n' << top[i] << '\n' << nxt[i];
			int p = i - top[i] - nxt[i];
			while(p)
				out << '\n' << top[p], p -= top[p];
			return 0;
		}
	return 0;
}