题目链接 https://www.luogu.org/problemnew/show/P1118
这道题想了好久,总觉得DFS绝对会超时,但是剪枝没思路。。。看了大佬的源码,才勉勉强强知道这是一道DFS+数论的题目,杨辉三角真的666,性质好多
大佬的解题思路 http://www.pianshen.com/article/4287271386/
最后附上蒟蒻的代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 using namespace std; 5 int vis[100],a[111],b[1001][1001],sum,n; 6 void dfs(int cur,int num) 7 { 8 int i,j; 9 //cout<<"num: "<<num<<endl; 10 if(cur>=n||num>=sum) 11 { 12 if(num==sum&&cur==n) 13 { 14 //cout<<endl; 15 for(j=1;j<=n;j++) 16 cout<<a[j]<<" "; 17 cout<<endl; 18 exit(0); 19 } 20 return; 21 } 22 for(i=1;i<=n;i++) 23 { 24 if(!vis[i]) 25 { 26 a[cur+1]=i; 27 //cout<<a[cur+1]<<' '; 28 vis[i]=1; 29 dfs(cur+1,num+a[cur+1]*b[n][cur+1]); 30 vis[i]=0; 31 } 32 } 33 } 34 int main() 35 { 36 int i,j; 37 cin>>n>>sum; 38 memset(b,0,sizeof(b)); 39 b[1][1]=1; 40 for(i=2;i<=n;i++) 41 for(j=1;j<=i;j++) 42 b[i][j]=b[i-1][j-1]+b[i-1][j]; 43 memset(vis,0,sizeof(vis)); 44 dfs(0,0); 45 }
DFS还是没学到位啊啊啊