poj3187解题报告

来源:互联网 发布:算法工程师职业规划 编辑:程序博客网 时间:2024/06/05 15:32

这题比较简单吧,想了半小时,终于写出来,实力太差没办法。。。不过是自己独立想出来的,做出来后还挺爽的,虽然速度不快

这里我用暴力求解

    3   1   2   4      4   3   6        7   9         16
题目要求第一行的数字两两相加,得到下一行的数字,直到只剩下一个数字16

题目要求输入一个N和一个总和。要我们逆输出第一行的N个数字。 (1 <= N <= 10)

Sample Input

4 16

Sample Output

3 1 2 4
我们就顺着题目的思路,要求得到和为16的4个数字是怎么样的组合。

我们按字典顺序求解。所以最初我们把1-N的数字按顺序摆放好

1 2 3 4这样的顺序的最后的结果是20,这显然不等于16

所以我们按字典顺序得出新的组合1 3 2 4,结果也是20

那我们就继续重复这样的思路,直到得出的结果为16为止的那组数字就是我们的求解。

所以我把N个数字存在一个二维数组里。

最初的N个数字按顺序放在ans[0]里。计算的第一次结果放在ans[1]里,直到ans[n-1]为止,如果得到的结果是对的,我们就把ans[0]里的n个数字输出。

这里用到一个标准库的函数next_permutation,按字典顺序生成一个组合的下一个组合。

例如全排列{1,2,3}按照字典序的下一个排列分别是123, 132, 213, 231, 312, 和321。

还是比较简单的,代码略难看。

#include<cstdio>#include<algorithm>using namespace std;int main(){int n, sum;scanf("%d%d", &n, &sum);int ans[10][10];for (int i = 0; i < n; i++)ans[0][i] = i+1;int k = n;  do{  k = n;for (int i = 1; i < n; i++){k--;for (int j = 0; j < k; j++){ans[i][j] = ans[i - 1][j] + ans[i - 1][j + 1];}}if (ans[n - 1][0] == sum)break;}while (next_permutation(ans[0], ans[0] + n));    for (int i = 0; i < n; i++)  printf("%d ", ans[0][i]);}



0 0
原创粉丝点击