穷竭搜索:POJ 3187 Backward Digit Sums

题目:http://poj.org/problem?id=3187

题意:

像这样,输入N : 表示层数,输入over表示最后一层的数字,然后这是一个杨辉三角,根据这个公式,由最后一层的数,推出第一行的数字(由1~N组成)。如果有多个解,按字典序升序,输出第一个解。

题解水题,不多说

AC代码:

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

int N, over;

void solve()
{
    int num[11][11];
    scanf("%d%d", &N, &over);
    
    for (int i = 1; i <= N; i++) {
        num[0][i - 1] = i;
    } 
    
    do {
        for (int i = 1; i < N; i++) {
            for (int j = 0; j < N - i; j++) {
                num[i][j] = num[i - 1][j] + num[i - 1][j + 1];
            }
        }
//        cout << "Debug: " << num[N - 1][0] << endl; 
        if (num[N - 1][0] == over) {
            break;
        }
    } while (next_permutation(num[0], num[0] + N));
    
    //本来就是按字典序来搜索的,根本不用考虑题目最后一个条件 →_→,直接输出第一行就可以 
    for (int i = 0; i < N; i++) {
        if (i != N - 1) {
            printf("%d ", num[0][i]);
        }
        else {
            printf("%d
", num[0][i]);
        }
    }
}

int main()
{
    solve();
    
    return 0;    
} 
原文地址:https://www.cnblogs.com/douzujun/p/8511511.html