【算法随笔】剪枝

由 MisakaStone 发布

剪枝是一种可以提高搜索算法时间和空间效率的技巧,经过剪枝或其他策略优化过的算法在执行效率上远超一般未经剪枝的算法。


例1 数的划分

题目来源:P1025 NOIP2001 提高组 数的划分 - 洛谷

题目描述

将整数 $n$ 分成 $k$ 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:$n=7$,$k=3$,下面三种分法被认为是相同的。

$1,1,5$;
$1,5,1$;
$5,1,1$.

问有多少种不同的分法。

输入格式

$n,k$ ($6<n \le 200$,$2 \le k \le 6$)

输出格式

$1$ 个整数,即不同的分法。

样例 #1

样例输入 #1

7 3

样例输出 #1

4

提示

四种分法为:
$1,1,5$;
$1,2,4$;
$1,3,3$;
$2,2,3$.

题解

import java.util.Scanner;

public class Main {

    static int n = 0;
    static int k = 0;
    static int count = 0;

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);
        n = keyboard.nextInt();
        k = keyboard.nextInt();
        keyboard.close();

        dfs(0, 1, 0);
        System.out.println(count);

    }

    public static void dfs(int level, int origin, int sum) {
        if (level == k) {
            if (sum == n) {
                count ++;
            }
            return;
        }
        for (int num = origin; num * (k - level) <= n - sum; num ++) { // 剪枝:num * (k-level) <= n-sum
            dfs(level + 1, num, sum + num);
        }
    }

}

暂无评论

发表评论