poj3187-Backward Digit Sums(枚举全排列)

一,题意:
输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列(杨辉三角)
    3 1 2 4 //1~n 全排列中的一个排列

     4 3 6

      7 9

sum = 16
二,思路:
枚举1~n的所有排列,直至有一种排列使得最后结果为sum就结束。next_permutation()全排列函数的运用

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main() {
 5     int n, sum;
 6     while (cin >> n >> sum) {
 7         int a[11], b[11];
 8         for (int i = 0; i < n; i++) {
 9             a[i] = i + 1;
10         }
11         do {
12             for (int i = 0; i < n; i++) {
13                 b[i] = a[i];                        //不能改变a[]中的值,用b[]代替a[]
14             }
15             int i;
16             for (i = n; i > 1; i--) {                //第一次n个数相加,第二次n-1个数相加...直到只剩2个数相加
17                 for (int j = 0; j < i - 1; j++) {
18                     b[j] = b[j] + b[j + 1];            //后面的每一个数往前一位加,最后都加到a[0]上
19                 }
20             }
21             if (b[0] == sum)break;
22         } while (next_permutation(a, a + n));
23         for (int i = 0; i < n ; i++) {
24             cout << a[i] << " ";
25         }
26         cout << endl;
27     }
28     return 0;
29 }
View Code

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/My-Sunshine/p/4985455.html