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

题意

一个倒三角形,除最上层以外每个节点等于上左和上右两个节点值得和。
给出层数,最下层的值,求第一层的排列(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");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值