您的位置:首页 > 其它

【暑假复习】【搜索】POJ3187:Backward Digit Sums

2017-06-24 21:22 399 查看

题意

一个倒三角形,除最上层以外每个节点等于上左和上右两个节点值得和。

给出层数,最下层的值,求第一层的排列(1-n)

题解

很显然,最下层的值等于第一层的排列中,每个位置的值乘以杨辉三角中同层数该点的值

样例:

3 1 2 4

4 3 6

7 9

16

杨辉三角:

1 3 3 1

1 2 1

1 1

1

所以16=3*1+1*3+2*3+4*1

因此我的方法是先求出n层杨辉三角底层的值,再枚举1-n的全排列,如满足上述条件就返回。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 15
using namespace std;
int n,m;
int dp[MAXN],used[MAXN],a[MAXN];
int dfs(int x,int cnt){
if(x==n+1){
if(cnt==m)
return 1;
return 0;
}
for(int i=1;i<=n;i++)
if(used[i]==0){
used[i]=1;
a[x]=i;
if(dfs(x+1,cnt+i*dp[x])==1)
return 1;
used[i]=0;
}
return 0;
}
int main(){
while(SF("%d%d",&n,&m)!=EOF){
memset(dp,0,sizeof dp);
memset(a,0,sizeof a);
memset(used,0,sizeof used);
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=i-1;j>1;j--)
dp[j]=dp[j]+dp[j-1];
}
if(dfs(1,0)==0)
continue;
for(int i=1;i<=n;i++){
PF("%d",a[i]);
if(i!=n)
PF(" ");
else
PF("\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索