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;
}