题意:给一个数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'
);
}
|