/** @JUDGE_ID: GOKURI_SQUEEZE ??? C++ */ #include #include #include #include #include #include #include #include #include using namespace std; #define FNAME "coins.txt" #define cin fin typedef int vert; typedef int len_t; typedef pair edge; typedef vector edges; typedef vector > graph; len_t dijkstra( graph& G, vert src, size_t limit ) { vector shtstlen(G.size(), -1); int mp=0; vector frontier; frontier.push_back(src); shtstlen[src] = 0; while( !frontier.empty() ) { vector new_f; for(int i = 0; i < frontier.size(); i++) { const vector& ne = G[frontier[i]]; for(int j = 0; j < ne.size(); j++) { if(shtstlen[ne[j]] < 0) { shtstlen[ne[j]] = mp + 1; new_f.push_back(ne[j]); } } } frontier = new_f; mp++; } int result = INT_MIN; for(int i = 0; i < limit; i++) result = max(result, shtstlen[i]); return result; } int main() { ifstream fin(FNAME); if(!fin) return -1; int n; while(cin >> n) { vector coins; coins.push_back(1); for(int i = 1; i <= n; i++) { int a; cin >> a; coins.push_back(a); } //sort(coins.begin(), coins.end()); graph g(2 * coins.back()); for(int i = 0; i < g.size(); i++) for(int j = 0; j < coins.size(); j++) { if(i + coins[j] >= g.size()) continue; g[i + coins[j]].push_back(i); g[i].push_back(i + coins[j]); } cout << dijkstra(g, 0, coins.back()) << endl; } return 0; }