【暑假复习】【搜索】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"); } } }
相关文章推荐
- POJ3187-Backward Digit Sums-穷竭搜索
- POJ3187 Backward Digit Sums 【暴搜】杨辉三角
- poj3187 Backward Digit Sums---dfs暴力枚举
- poj 3187 Backward Digit Sums(穷竭搜索dfs)
- POJ3187---Backward Digit Sums
- POJ 3187 Backward Digit Sums (杨辉三角,穷竭搜索,组合数,DFS)
- Backward Digit Sums(poj3187)(STL next_permutation运用)
- pku 3187 Backward Digit Sums搜索
- POJ 3187(Backward Digit Sums 穷竭搜索,杨辉三角性质)
- POJ3187 Backward Digit Sums 枚举
- poj3187 Backward Digit Sums
- poj3187-Backward Digit Sums(枚举全排列)
- POJ 3187 Backward Digit Sums 【穷竭搜索 next_permutation函数】
- Backward Digit Sums(POJ 3187, 穷竭搜索)
- POJ3187 Backward Digit Sums【全排列】
- POJ3187 Backward Digit Sums
- 2015 寒假搜索专题 K - Backward Digit Sums
- POJ3187-Backward Digit Sums
- poj3187 Backward Digit Sums(枚举)
- POJ3187 Backward Digit Sums 【暴搜】