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
- poj3187解题报告
- POJ3187
- poj3187
- poj3187
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- dfs--poj3187
- poj3187【dfs】
- Antiprime解题报告
- expr解题报告
- 华容道解题报告
- tju解题报告
- zju1062/pku1095解题报告
- 【 题集 】 【kuangbin带你飞】专题十六 KMP & 扩展KMP & Manacher
- hdu 1850 Being a Good Boy in Spring Festival 博弈论之尼姆博弈,,都被自己蠢哭了!
- 2.25学习内容,小米平板开发选项,linux cpu信息,安卓图片简单缩放移动
- Android打造通用的下拉刷新组件
- Cancelled my American Express Credit card
- poj3187解题报告
- 随机数发生器
- html+css图片首页
- 第三章
- TCP基础--协议包基本分析
- Linux编程-----实用技巧
- hdu 4908 BestCoder Sequence && BestCoder Round #3 1002
- 通过鼠标控制精灵
- Java学习笔记21