poj3187 Backward Digit Sums

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

有一组数,对这组数相邻两个元素依次求和,求和得到新的一组数,反复执行这个操作,直到只剩下一个数。给出一个整数N和最终和,找到1~N的一种排列,使得这个排列在执行刚才所述操作后得到的数等于最终和。

输入样例

4 16

输出样例

3 1 2 4

N的范围不大,最多为10,所以可以把1~N的所有排列枚举出来,然后依次执行三角形求和的操作,比较最后的结果。

代码

#include <iostream>
#include <algorithm>
using namespace std;
int a[11];

int cal_adjacent_sum(int a[], int size){ //模拟三角形求和的过程
    int sum = 0; int g[11][11];
    for(int i = 0; i < size; ++i) g[0][i] = a[i];
    for(int i = 1; i < size; ++i){
        for(int j = 0; j < size-i; ++j) g[i][j] = g[i-1][j] + g[i-1][j+1];
    }
    return g[size-1][0];
}

int main(){
    int N, target;
    scanf("%d%d", &N, &target);
    for(int i = 1; i <= N; ++i) a[i-1] = i;
    do{
        if(cal_adjacent_sum(a, N) == target){
            for(int i = 0; i < N; ++i) printf("%d ", a[i]);
            printf("\n");
            break;
        }
    }while(next_permutation(a, a+N));
    return 0;
}
posted @ 2020-01-09 22:59  patrolli  阅读(90)  评论(0编辑  收藏  举报