洛谷P1118 [USACO06FEB]数字三角形 DFS+杨辉三角

看了解题才知道系数跟杨辉三角有关...

杨辉三角,是二项式系数在三角形中的一种几何排列。

比如n=4时,假设答案是a,b,c,d,那么满足a*1+b*2+c*2+d*1==sum(1,2,2,1是杨辉三角的第三行)

这样的话直接搜索就好了

#include<iostream>
using namespace std;
int yh[13][13];//杨辉三角
int n,sum,flag;
int a[13],book[13],ans[13];//book是标记数组,a[]是1到n的数组 
void creat()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        yh[i][1]=1;
        yh[i][i]=1;
        for(j=2;j<=i-1;j++)
            yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
    }
}//1到12的二项展开式系数
void dfs(int x,int summ)
{
    int i;
    if(summ==sum&&flag==0&&x==n)
    {
        for(i=1;i<=n;i++)cout<<ans[i]<<" ";
        flag=1;
        return;
    }
    if(flag==1)return;
    if(summ>sum)return;//不加这一句就会TLE 
    for(i=1;i<=n;i++)
    {
        if(book[i]==0)
        {
            book[i]=1;
            ans[x+1]=a[i];
            dfs(x+1,summ+a[i]*yh[n][x+1]);
            book[i]=0;
        }
    }
}
int main()
{
    cin>>n>>sum;
    for(int i=1;i<=n;i++)a[i]=i;//初始化a[i]数组 
    creat();
    dfs(0,0);
}
View Code

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/9952349.html