1. 程式人生 > >做題記錄: P1118 [USACO06FEB]數字三角形Backward Digit Su…

做題記錄: P1118 [USACO06FEB]數字三角形Backward Digit Su…

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…