1. 程式人生 > >P1118 數字三角形【楊輝三角+全排列】

P1118 數字三角形【楊輝三角+全排列】

#include<bits/stdc++.h>
using namespace std;
int a[20][20];
int b[20];
int c[20][20];
int cmp(int a,int b)
{
	return a>b;
}
int main()
{
    int n=1,sum;
    cin>>n>>sum;
    for(int i=1;i<=n;i++)
    b[i]=i;
    int s=0;
    for(int i=1;i<=n;i++)
	{
		c[i][1]=c[i][i]=1;
	}
	for(int i=3;i<=n;i++)
	{
		for(int j=1;j<=(i-1)/2;j++)
		{
			c[i][j+1]=c[i][i-j]=c[i-1][j]+c[i-1][j+1];
		}
		
	}
    if(sum<n*n) return 0;
    do
    {
    	int ok=1,w=0;
    	for(int i=1;i<=n;i++)
    	{
    		w+=c[n][i]*b[i];
    		if(w>sum) sort(b+i,b+1+n,cmp);
		}
		
    	for(int i=1;i<=n/2;i++)
    	{
    		if(b[i]>b[n-i+1]) 
    		{
    			ok=0;break;
			}
		}
		if(ok==0) continue;
    	for(int i=1;i<=n;i++)
    	a[1][i]=b[i];
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=1;j<=n-i+1;j++)
    		{
    			a[i][j]=a[i-1][j]+a[i-1][j+1];
    			
			}
		}
		if(a[n][1]==sum) 
		{
			for(int i=1;i<n;i++)
			printf("%d ",b[i]);
			printf("%d\n",b[n]);
			break;
		}
	}while(next_permutation(b+1,b+1+n));
    return 0;
}