标题:数字划分
w星球的长老交给小明一个任务:
1,2,3...16 这16个数字分为两组。
要求:
这两组数字的和相同,
并且,两组数字的平方和也相同,
并且,两组数字的立方和也相同。
请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。
这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 ... 这样的答案。
注意,只提交这一组数字,不要填写任何多余的内容。
----------------------------------------
笨笨有话说:
只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。
凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:
既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。
貌似都是8个成员的可能性很大啊。
答案: 1 4 6 7 10 11 13 16
import java.util.ArrayList;
public class _数字划分 {
private static int[] array = new int[16];
private static int[] square = new int[16];
private static int[] cube = new int[16];
public static void main(String[] args) {
for(int i = 1;i <= 16;i++){
array[i-1]=i;//sum 136
square[i-1]=i*i;//sum 1496
cube[i-1]=i*i*i;//sum 18496
}
int sum = 18496 / 2;
dfs(cube, sum, 0, new ArrayList<Integer>());
/*System.out.println("***************分界线***************");
sum = 1496 / 2;
dfs(square, sum, 0, new ArrayList<Integer>());*/
}
/**
*
* @param arr 数组
* @param sum 总和
* @param cur 数组下标
* @param list 数组分成两组,各自总和等于sum,将该数字加入集合
*/
private static void dfs(int[] arr, int sum, int cur, ArrayList<Integer> list) {
if(sum == 0){
for(int i = 0;i < list.size();i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
for(int i = 0;i < list.size();i++){
for(int j = 0;j < 16;j++){
if(list.get(i) == arr[j]){
System.out.print(array[j]+" ");//输出两组数字
}
}
}
System.out.println();
return;
}
if(sum<0 || cur==arr.length)return;
dfs(arr, sum, cur+1, list);//不要当前数字
list.add(arr[cur]);
int index = list.size()-1;
dfs(arr, sum - arr[cur], cur+1, list);//要当前数字
list.remove(index);//回溯
}
}