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 }

 

posted @ 2015-04-22 14:01  iswoit  阅读(720)  评论(0编辑  收藏  举报