深搜优化剪枝

之前做过不少深搜题,很多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);
}
原文地址:https://www.cnblogs.com/648-233/p/10992971.html