做題記錄: P1118 [USACO06FEB]數字三角形Backward Digit Su…
阿新 • • 發佈:2018-02-24
clas return ring 是否 style back ble sin names
P1118 [USACO06FEB]數字三角形Backward Digit Su…
/*思路:設一開始的n個數為a1、a2、a3...an, 一步一步合並就可以用a1..an表示出最後剩下來 的數,不難發現其中a1..an的系數恰好就是第n層 楊輝三角中的數。所以我們可以先處理出第n層楊 輝三角中的數,然後根據這一層中的數搜索即可。*/ #include<iostream> #include<cstdio> #include<fstream> #include<algorithm> #include<string> #include<sstream> #include<cstring> using namespace std; int n=0,sum=0,t[20],ans[20]; bool flag=false,book[20];//flag表示是否已經得出答案 void dfs(int x,int y) { //如果已經得出答案或者當前的和大於給定的和,就結束搜索 if(flag||y>sum) return; if(x>n)//表示已經搜完 { if(y==sum)//如果當前答案等於給定的和 { for(int i=1;i<=n;i++) printf("%d ",ans[i]);//就輸出答案 flag=true;//標記已經得出答案,因為數是從小到大枚舉的,所以第一個出現的答案一定是字典序最小。 } return; } for(int i=1;i<=n;i++)//枚舉當前數 if(!book[i])//如果這個數還沒被用過 { book[i]=true;//標記 ans[x]=i;//記錄 dfs(x+1,y+t[x]*i);//搜索 ans[x]=0;//回溯 book[i]=false;//回溯 } } int main() { scanf("%d%d",&n,&sum); t[1]=1; for(int i=2;i<=n;i++)//預處理第n層出的楊輝三角 for(int j=i;j>=1;j--) t[j]+=t[j-1]; dfs(1,0);//搜索 return 0; }
做題記錄: P1118 [USACO06FEB]數字三角形Backward Digit Su…