之前做过不少深搜题,很多TLE,所以剪枝很重要,如何“未雨绸缪”,避免不必要的搜索树分支?
例题:
数的划分
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。 输出一个整数,即不同的分法。
由题意得,其分发出现重复数字组合则为同一种算法,那么保证1-k个数递增即可
代码:
#include<bits/stdc++.h> using namespace std; int n,m,k,s; int a[10]; void search(int k){ if(n==0) return; if(k==m){ if(n>=a[k-1]){ s++; return; } } for(int i=a[k-1];i<=n/(m-k+1);i++){ a[k]=i; n-=i; search(k+1); n+=i; } } int main(){ scanf("%d%d",&n,&m); a[0]=1; search(1); printf("%d",s); }