编写一个函数,传入一个int型数组,返回该数组能否分成两组
2017-01-20 00:00
519 查看
题目描述
编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等, 并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以 上条件,返回true;不满足时返回false。
输入描述
输入输入的数据个数
输出描述
返回true或者false
输入例子
4 1 5 -5 1
输出例子
true
算法实现
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { // 可以被5整除的数的和 int five = 0; // 可以被3整除的数的和,不包括同时可以被5整除的数 int three = 0; List<Integer> list = new ArrayList<>(); int num = scanner.nextInt(); for (int i = 0; i < num; i++) { int v = scanner.nextInt(); if (v % 5 == 0) { five += v; } else if (v % 3 == 0) { three += 3; } else { list.add(v); } } System.out.println(divide(five, three, list)); } scanner.close(); } /** * 找出一种方法将list中的元素分成两个部分,分别与m,n相加,得x,y。使得x=y,如果找到这种方法返回true,否则返回false * * @param m 初始值 * @param n 初始值 * @param list 集合 * @return true可以找对应方法,false无对应方法 */ private static boolean divide(int m, int n, List<Integer> list) { int other = 0; for (int i : list) { other += i; } // 和为偶数才可能划分 if ((m + n + other) % 2 == 0) { // 两个数之间的差 int diff = Math.abs(m - n); // 差与余下数的和相等,则可以划分 if (diff == other) { return true; } // 差比余下数的和在,则不可以划分 else if (diff > other) { return false; } else { int sum = (m - n + other) / 2; return canFind(list, sum); } } return false; } /** * 在list中能否找到一组数据使用得其和是sum * * @param list 整数集合 * @param sum 和 * @return true:可以找到,false:不可以找到 */ private static boolean canFind(List<Integer> list, int sum) { // System.out.println(sum + " " + list); int count = (int) Math.pow(2, list.size()); int[] mark = new int[list.size()]; for (int i = 0; i < count; i++) { int val = 0; for (int j = 0; j < mark.length; j++) { if (mark[j] == 1) { val += list.get(j); } } if (val == sum) { return true; } inc(mark); } return false; } /** * 二进制加一操作,二进制数用数组表示,从左到右是低位到高位 * * @param mark 等待加一的二进制数组 */ private static void inc(int[] mark) { int carry; int idx = 0; do { mark[idx]++; carry = mark[idx] / 2; mark[idx] %= 2; idx++; } while (carry > 0 && idx < mark.length); } }
相关文章推荐
- 【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)
- 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- C语言实现 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 编写一个函数 返回数组中最大值与最小值的差值
- 用JS编写一个函数,返回数组中重复出现过的元素(实例)
- 【嵌入式系统学习记录】练习:编写一个函数,求字符数组的前n个字符中最大字符的地址并返回该地址,字符数组和n作为函数的参数;
- 编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组。函数通过观察EOF判断输入列表是否结束。数组的第一个数是数组包含的值的个数,他的后面就是这些整数值。
- 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数
- 【CVTE】请使用js编写一个函数:chunk(arr,size),把一个数组arr按照指定的数组大小size分割成若干个数组块,传入的参数分别为数组
- 函数功能:传入一个数组,返回数组中第二大数。已知数组中的对象都是数字构成的字符串,且任意两元素不相等。 如传入:@[@"1",@"2",@"3",@"4"],返回@"3"
- 某面试题s=1+2-3+4-5+...+n编写一个函数,传入参数 n ,返回 s 的值
- Linux_C练习:编写一个函数,求字符数组的前n个字符中最大字符的地址并返回该地址,字符数组和n作为函数的参数;
- 编写一个函数,返回一个int数组中存储的最大数值,并在一个简单的程序中测试这个函数。(有缺陷)
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。
- C语言 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 编写一个函数,返回整型数组中的第二大值
- 编写一个函数,返回两个字符串的最大公串
- 做一个返回数组的函数(例子)
- 做一个返回数组的函数 DELPHI
- 【php数组函数序列】之array_push() - 数组尾部添加一个或多个元素(入栈),返回新长度。