POJ 3187: Backward Digit Sums
http://poj.org/problem?id=3187
题目的大致意思:
1.输入一个N,结果被限制为:只能是1到N的整数,而且只能有N个整数(即限定范围,又限定数量)
2.要求求出这N个数的排列,使他们按照类似杨辉三角型的规则进行相加后,结果为sum
思路是穷举法
用next_permutation函数枚举出前N个数组的全排列分别进行计算。得到的第一个结果就行
找不到结果这种可能性在本题中不存在,所以也不要什么特殊处理了
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 int n; //1-n 6 int sum; //要求的结果 7 int arr[10][10]; //中间结果 8 9 int main() 10 { 11 while (scanf("%d %d", &n,&sum) != EOF) 12 { 13 int input[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; //只可能是10位,所以就手工初始化了 14 do 15 { 16 for (int j = 0; j < n; j++) //arr数组的第一行处理,直接赋值 17 { 18 arr[0][j] = input[j]; 19 } 20 21 for (int i = 1; i < n; i++) //从第二行开始,递推关系 22 { 23 for (int j = 0; j < n - i; j++) 24 { 25 arr[i][j] = arr[i - 1][j] + arr[i - 1][j + 1]; 26 } 27 } 28 29 if (arr[n - 1][0] == sum) //找到匹配值,字典序的第一个,结束 30 break; 31 32 } while (next_permutation(input, input + n)); //全排列,只排前n个数字 33 34 //输出 35 for (int i = 0; i < n; i++) 36 { 37 if (i != 0) 38 printf(" "); 39 printf("%d", input[i]); 40 } 41 printf("\n"); 42 43 } 44 return 0; 45 }