Cubes(DFS+剪枝)

来源:互联网 发布:最火的网络用语 编辑:程序博客网 时间:2024/05/17 04:46

 

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

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

 

#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');}


原创粉丝点击