这个dfs怎么优化捏?蒟蒻求助

P1025 [NOIP2001 提高组] 数的划分

``` #include<bits/stdc++.h> using namespace std; int n,k,ans; void dfs(int x,int y,int last)//x代表现在还有几,y代表还可以分几个数,last代表上一个分的数 { if(!y&&!x)//如果分完了k个数且n无剩余就answer++ { ans++; return ; } if(!x||!y)return ;//除此之外若n无剩余或分完了k个数就返回 for(int i=last;i<=x;i++)dfs(x-i,y-1,i);//递归搜索下一步 } int main() { cin>>n>>k; dfs(n,k,1); cout<<ans; } ```
by One_more_light @ 2023-01-08 16:40:50


@[Tapper](/user/843596)
by One_more_light @ 2023-01-08 16:42:52


@[One_more_light](/user/912027) 谢谢dalao呜呜呜,关注了关注了
by Otion @ 2023-01-08 17:01:22


可以从大的先划分 让划分的数单调不增: for(int i=last;i>=0;i--) 然后用可行性减枝: if(x<=i*y&&x>=y) dfs(x-i,y-1,i); 只有剩下的数在 可能的最大到最小之间 这个方案才有可能
by yangjm @ 2023-01-10 19:45:46


@[Otion](/user/843596) 之前忘记@你了
by yangjm @ 2023-02-02 10:12:24


@[yangjm](/user/502227) 谢谢大佬!!!!!
by Otion @ 2023-02-02 11:42:02


|