您的位置:首页 > 其它

POJ3187---Backward Digit Sums

2015-03-10 15:06 302 查看
题目大意:给出杨辉三角的行数N,和顶端值M,求最底层1~N怎样排列才能使顶端值M。输出字典序最小的组合

分析:先求杨辉三角底层各个数的系数,然后,DFS就可以得到答案

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a[15], n, cur, k, flag, vis[15], c[15][15];

void dfs() {
if(k == n+1) {
int res = 0;
for(int i = 1; i <= n; i++) {
res = res + c
[i] * a[i];             //得到的排列分别乘以相应系数后相加
}
if(res == cur) {
for(int i = 1; i < n; i++)
printf("%d ", a[i]);
printf("%d\n", a
);
flag = 1;                               //找到字典序最小后,及时退出,以免超时
}
return;
}
for(int i = 1; i <= n; i++) {
if(flag) return;
if(!vis[i]) {
a[k++] = i;
vis[i] = 1;
dfs();
vis[i] = 0;
k--;
}

}
}

int main() {
scanf("%d%d", &n, &cur);
memset(vis, 0, sizeof(vis));
memset(c, 0, sizeof(c));
c[0][0] = 1;
for(int i = 1; i <= n; i++)                     //求杨辉三角底层的系数
for(int j = 1; j <= i; j++)
c[i][j] = c[i-1][j-1] + c[i-1][j];
k = 1;
flag = 0;
dfs();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj