POJ 3187 Backward Digit Sums

Posted Fighting Heart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3187 Backward Digit Sums相关的知识,希望对你有一定的参考价值。

暴力DFS+验证。

验证如果是o(n)检验可能复杂度会太高,事实上可以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;
}

 

以上是关于POJ 3187 Backward Digit Sums的主要内容,如果未能解决你的问题,请参考以下文章

poj 3187 Backward Digit Sums

POJ 3187 Backward Digit Sums

POJ3187 Backward Digit Sums 暴搜

POJ 3187 Backward Digit Sums

POJ 3187 Backward Digit Sums

POJ3187Backward Digit Sums[杨辉三角]