There are 1 to \(N\) digits (\(1\le N \le 10\)) in certain order. Add adjacent numbers together to get the next line, until the there is only one number left.(Just like Pascal's triangle) For example, there are 3 integers: $$ 1, 2, 3 $$ $$ 3, 5 $$ $$ 8 $$

So, given \(N\) and the final sum, find the lexicographically least ordering of integers.

Link: http://poj.org/problem?id=3187

Notes:

  • Be aware of that the question is asking 1 to \(N\) digits, so we don't have to test all possible permutations from 1 to 10.

  • The results of next_permutation() in STL are in ascending order in default.






Solution:

Use next_permutation() to check all possibilities and stimulate the triangle additions. Since the permutation is already in lexicographical order, when we get the find the first result, it is the final answer.

#include<iostream>
#include<algorithm>
using namespace std;

int n, sum, ans[11], s[11];

void solve() {
    for (int i = 1; i <= n; i++) ans[i-1] = i;
    if (n == 1 && ans[0] == sum) {
        cout << sum << endl;
        return;
    }
    do {
        for (int i = 0; i < n-1; i++)
            s[i] = ans[i]+ans[i+1];
        for (int i = n-2; i >= 0; i--) {
            for (int j = 0; j < i; j++)
                s[j] = s[j]+s[j+1];
        }
        if (s[0] == sum) {
            for (int i = 0; i < n; i++) cout << ans[i] << " ";
            cout << endl;
            return;
        }
    } while (next_permutation(ans, ans+n));
}

int main(void) {
    cin >> n >> sum;
    solve();
    return 0;
}