您的位置:首页 > 其它

POJ 3187 Backward Digit Sums

2016-03-30 08:44 267 查看
暴力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
[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
[0+1]);
flag[i]=0;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: