您的位置:首页 > 其它

poj3187Backward Digit Sums(暴力dfs)

2013-12-22 10:34 148 查看
题目请戳这里

题目大意:给一个n(<=10),然后用n的一个全排列做为第一行,然后相邻2个数做和,放到下一行,这样组成一个倒着的数塔,第n行只剩下了一个sum.现在给你一个n和一个sum,求第一行字典序最小的一个排列.

题目分析:最坏10!复杂度,直接爆搜啦,剪枝都免了,妥妥的


详情请见代码:

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

const int N = 11;
int lcm

;
bool flag
,ok;
int n,sum;

void dfs(int cur,int dp)
{
if(ok)
return;

lcm[1][dp] = cur;
int i;
for(i = 2;i <= dp;i ++)
lcm[i][dp - i + 1] = lcm[i - 1][dp - i + 1] + lcm[i - 1][dp - i + 2];
if(dp == n)
{
if(lcm
[1] == sum)
{
for(i = 1;i <= n;i ++)
printf("%d%c",lcm[1][i],i == n?'\n':' ');
ok = true;
}
return;
}
for(i = 1;i <= n;i ++)
{
if(!flag[i])
{
flag[i] = true;
dfs(i,dp + 1);
flag[i] = false;
}
}
}

void fuck()
{
memset(flag,false,sizeof(flag));
ok = false;
for(int i = 1;i <= n && !ok;i ++)
{
flag[i] = true;
dfs(i,1);
flag[i] = false;
}
}

int main()
{
while(scanf("%d%d",&n,&sum) != EOF)
{
fuck();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 dfs