17年蓝桥杯国赛--数字划分(Java)

标题:数字划分


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);//回溯
	}

}

猜你喜欢

转载自blog.csdn.net/Baobab_Tree/article/details/89516944