一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2
来源:互联网 发布:mac粉尘壁纸 编辑:程序博客网 时间:2024/04/28 09:52
问题描述:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m 的最大值为3
算法分析:
* 既然要分成m等份,则数组的和对m取余数肯定为0,且m的取值范围为1<m<=n,既然
* 求m的最大值,则让m从n开始递减,第一个满足条件的即为m的最大取值。设数组为a,
* 数组的和为sum,设一临时数组temp来存储分组情况,groupID表示分组编号
* 比如temp[i]=1,则说明a[i]分在第一组。
* 当sum%m不等于0时,跳过,m递减;当sum%m等于0时,遍历数组中每个元素,若当前
* 元素状态为未选择,即temp[i]=0,将其分配到相应组中,进行如下判断:
* a.若组内元素和>sum/m,则说明当前元素不适合加入该组,令temp[i]=0;
* b.若组内元素和=sum/m,则令groupID++,继续遍历,判断下一组;
* c.若组内元素和<sum/m,则将当前元素状态改为已选,temp[i]=组号,继续进行下
* 一个元素的判断;
* 则满足条件的第一个m值即为最大的。
代码实现:
public class fraction {/** * @param PLA * 问题描述:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值 比如{3,2,4,3,6} * 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6} m=3 所以m * 的最大值为3 *//* * 算法分析: 既然要分成m等份,则数组的和对m取余数肯定为0,且m的取值范围为1<m<=n,既然 * 求m的最大值,则让m从n开始递减,第一个满足条件的即为m的最大取值。设数组为a, * 数组的和为sum,设一临时数组temp来存储分组情况,groupID表示分组编号 比如temp[i]=1,则说明a[i]分在第一组。 * 当sum%m不等于0时,跳过,m递减;当sum%m等于0时,遍历数组中每个元素,若当前 * 元素状态为未选择,即temp[i]=0,将其分配到相应组中,进行如下判断: * a.若组内元素和>sum/m,则说明当前元素不适合加入该组,令temp[i]=0; * b.若组内元素和=sum/m,则令groupID++,继续遍历,判断下一组; * c.若组内元素和<sum/m,则将当前元素状态改为已选,temp[i]=组号,继续进行下 一个元素的判断; 则满足条件的第一个m值即为最大的。 */public static void main(String[] args) {// TODO Auto-generated method stubint[] a = { 3, 2, 4, 3, 6 };int n = a.length;System.out.println("原数组:");for (int i : a) {System.out.println(i + " ");}getMax(a, n);}private static void getMax(int[] a, int n) {// TODO Auto-generated method stubint sum = 0;int[] temp = new int[n];// 用于记录数组中当前元素的分组状态for (int i : a) {sum += i;}for (int m = n; m > 1; m--) {if (sum % m != 0)continue;for (int j = 0; j < n; j++) {temp[j] = 0;}if (Test(a, n, m, sum / m, temp, sum / m, 1)) {System.out.println("The Max m is:" + m);break;}}}private static boolean Test(int[] a, int n, int m, int groupSum,int[] temp, int total, int groupID) {// TODO Auto-generated method stubif (total < 0) {// 说明加上当前元素后数小组元素的和过大return false;}if (total == 0) {groupID++;total = groupSum;if (groupID == m + 1) {return true;}}for (int i = 0; i < n; i++) {if (temp[i] != 0)continue;temp[i] = groupID;if (Test(a, n, m, groupSum, temp, total - a[i], groupID))return true;temp[i] = 0;// 当前元素分配失败,置回初始状态}return false;}}运行结果:
原数组:3 2 4 3 6 The Max m is:3
0 0
- 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2
- 一个整数组,长度为 n,将其分为 m 份,使各的和相等求 m 的最大值,比如{3,2,4,3,6} 可以分成{3,2,4,3,6,} m=1;{3,6}{2,4,3}m=2 {3,3}{2,4}{6}
- 45一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。
- 【微软谷歌面试100题--【45】一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使得各分的和相等
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 整数数组,长度为n,分为m份。求m最大值
- 查询电话联系人(包括sim卡)
- freemarker使用心得
- hdu 2138 How many prime numbers(数论:素数判定)
- 后会无期
- 为什么你这么笨呀?
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2
- RCP: P2 Update两个烦人bug和解决办法
- julia 与并行计算(部分有参考和转载)
- 从零开始学Xamarin.Forms(一) 概述
- addmrpt_1_50348_5034 分析
- 有没有免费的数据恢复软件,easyrecovery中文版
- java中Class.getResource用法
- poj 1655 Balancing Act
- HBase简介(很好的梳理资料)