poj3187Backward Digit Sums(暴力dfs)

来源:互联网 发布:js北京颜色修改 编辑:程序博客网 时间:2024/06/15 02:22

题目请戳这里

题目大意:给一个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[N][N];bool flag[N],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[n][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;}


0 0
原创粉丝点击