P1118 数字三角形(技巧)

题见洛谷
带有技巧的搜索,用到杨辉三角形

P1118 数字三角形(技巧)_第1张图片
不难看出 第几个(k)拆的数(虽说并不是拆的),系数为杨辉三角第n行,第k列的数字

#include
#include
#include
#include
#include
#include
using namespace std;
int n,sum,a[124];
int yh[20][20];
bool f[20]; 
void dfs(int k,int tot)
{
    //if(tot>sum) return;
    if(k==n+1){
        if(tot==sum){
          for(int i=1;i<=n;i++)
           printf("%d ",a[i]);
          exit(0);
        }

        return;
    }
    for(int i=1;i<=n;i++){
      if(tot+i*yh[n][k]<=sum)
       if(!f[i]){
         a[k]=i;f[i]=true;
         dfs(k+1,tot+i*yh[n][k]);
         a[k]=0;f[i]=false;//回溯! 
       }
    }

}
int main()
{
    scanf("%d%d",&n,&sum);
    yh[1][1]=1;
    for(int i=2;i<=n;i++)
     for(int j=1;j<=i;j++)
        yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
    /*for(int i=1;i<=n;i++){
      printf("%d ",yh[n][i]);
    }*/

    dfs(1,0);

    return 0;
} 

转载于:https://www.cnblogs.com/dfsac/p/6819777.html

你可能感兴趣的:(P1118 数字三角形(技巧))