POJ 3187 Backward Digit Sums

暴力DFS+验证。

验证如果是暴力检验可能复杂度会太高,事实上可以o(1)进行,这个可以o(n*n)dp预处理。

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

const int maxn=20;
bool flag[maxn];
bool r;
int a[maxn];
int n,sum;

int mul[15][15];

bool check(int s)
{
    if(s==sum) return 1;
    return 0;
}

void dfs(int deep,int tot)
{
    if(deep==n-1)
    {
        if(check(tot))
        {
            r=1;
            for(int i=0;i<=deep;i++)
            {
                printf("%d",a[i]);
                if(i<deep) printf(" ");
                else printf("\n");
            }
        }
        return ;
    }

    for(int  i=1;i<=n;i++)
    {
        if(flag[i]==0)
        {
            flag[i]=1;
            a[deep+1]=i;
            dfs(deep+1,tot+a[deep+1]*mul[n][deep+1+1]); if(r==1) return;
            flag[i]=0;
        }
    }
}

void init()
{
    memset(mul,0,sizeof mul); mul[1][1]=1;
    for(int i=2;i<=10;i++)
    {
        for(int j=1;j<=10;j++) mul[i][j]=mul[i-1][j];
        for(int j=2;j<=10+1;j++) mul[i][j]=mul[i][j]+mul[i-1][j-1];
    }
}

int main()
{
    init();
    while(~scanf("%d%d",&n,&sum))
    {
        r=0; memset(flag,0,sizeof flag);
        for(int i=1;i<=n;i++)
        {
            flag[i]=1;
            a[0]=i;
            dfs(0,a[0]*mul[n][0+1]);
            flag[i]=0;
        }
    }
    return 0;
}

 

posted @ 2016-03-30 08:44  Fighting_Heart  阅读(137)  评论(0编辑  收藏  举报