Cubes(DFS+剪枝)

Posted zhwong

tags:

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

 

题意:给一个数N,求N最少由多少个数的立方构成,并输出这些数。

做法:DFS + 剪枝,剪枝的边界很很很重要!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int cub[400];
int ans[300];
int tp[300];
int n;
int sum = 0x3f3f3f3f; //个数
void dfs(int left, int depth, int pos) {
    if(left == 0 && depth < sum) {  //成立则更新ans数组
        sum = depth;
        for(int i = 0; i < depth; i++) ans[i] = tp[i];
        return;
    }
    if(depth +1 >= sum) return;  //等于号是多么的重要orz....
    for(int i = pos; i >= 1; i--) {
        if(cub[i] > left) continue;
        if(depth + left / cub[i] >= sum) return;  //等于号是多么的重要orz....
        tp[depth] = i;
        dfs(left - cub[i], depth+1, i); //下一次从第i个数开始搜
    }
}
int main() {
    for(int i = 0; i < 400; i++) cub[i] = i * i * i; 
    scanf("%d", &n);
    dfs(n, 0, 366);
    printf("%d\\n", sum);
    for(int i = 0; i < sum; i++) {
        if(i > 0) putchar(\' \');
        printf("%d", ans[i]);
    }
    putchar(\'\\n\');
}

以上是关于Cubes(DFS+剪枝)的主要内容,如果未能解决你的问题,请参考以下文章

A. The Fault in Our Cubes 暴力dfs

[dfs] aw166. 数独(dfs剪枝与优化+状态压缩+代码技巧+好题)

HDU1010-奇偶剪枝(DFS)

出界的路径数--dfs记忆化+剪枝

Sicily 1153: 马的周游问题(DFS+剪枝)

DFS+剪枝Aw842.排列数 & Aw843.N-皇后问题