调了两天了,最好成绩就是这个了,20分,求助

P1025 [NOIP2001 提高组] 数的划分

带注释版本 ```cpp #include<bits/stdc++.h>//万能头 using namespace std; //std命名空间 stack<int> stk;//定义一个stack int n,k,ans=0,sum=0;//变量,nk不解释,ans答案数,sum目前栈中元素总和 void dfs(){//dfs函数 if(stk.size()==k){//如果栈满了 if(sum==n){//如果和为n ans++;//答案数+1 } stk.pop();//出栈 return;//回溯 } for(int i=stk.top()/*因为要排重,所以按单调来搜*/;i*(k-stk.size())<=n-sum/*剪枝*/;i++){ stk.push(i);//入栈 sum+=i;//总和+i dfs();//继续搜索 sum-=i;//总和-i } } int main(){//主函数 scanf("%d %d",&n,&k);//输入 for(int i=1;i*k<=n;i++){//循环枚举第一个数 stk.push(i);//将第一个数入栈 sum+=i;//总和+i dfs();//开始搜索 stk.pop();//出栈 sum-=i;//总和-i } printf("%d",ans);//输出 return 0; } ```
by 大米爱干饭 @ 2023-03-05 21:34:56


```cpp #include<bits/stdc++.h> using namespace std; stack<int> stk; int n,k,ans=0,sum=0; void dfs(){ if(stk.size()==k){ if(sum==n){ ans++; } stk.pop(); return; } for(int i=stk.top();i*(k-stk.size())<=n-sum;i++){ stk.push(i); sum+=i; dfs(); sum-=i; stk.pop(); } } int main(){ scanf("%d %d",&n,&k); for(int i=1;i*k<=n;i++){ stk.push(i); sum+=i; dfs(); stk.pop(); sum-=i; } printf("%d",ans); return 0; } ```
by _Minmatar_Star @ 2023-03-06 18:20:20


把stack删了,用纯递归已AC,大佬们不用费心了
by 大米爱干饭 @ 2023-03-06 19:24:32


|