深搜优化剪枝

Posted 648-233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深搜优化剪枝相关的知识,希望对你有一定的参考价值。

之前做过不少深搜题,很多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);

 

以上是关于深搜优化剪枝的主要内容,如果未能解决你的问题,请参考以下文章

7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)

深搜的剪枝技巧

深搜+剪枝--poj2676--数独

UVA 11882 Biggest Number 深搜 剪枝

解数独算法的实现——剪枝优化

POJ1011 (深搜+剪枝)