把一个整数数组,分成个大小相同的子数组
2017-04-28 15:18
399 查看
今天有个人问我题目,大概就是要把一个整数数组,分成个大小相同的子数组
做不到的话就返回null
思想:
额感觉是01背包的变种
先累加和,然后得到和的一半
每个物体的体积是数的大小
然后尽可能装满背包
dp方程:f[i][V] = max(f[i-1][V-v[i]]+v[i], f[i-1][V] )
做不到的话就返回null
思想:
额感觉是01背包的变种
先累加和,然后得到和的一半
每个物体的体积是数的大小
然后尽可能装满背包
dp方程:f[i][V] = max(f[i-1][V-v[i]]+v[i], f[i-1][V] )
import java.util.*; public class divide { public static void main(String[] args) { int[] array = {2 ,3, 4 ,1 ,6 }; ArrayList<Integer> list=getMaxDiff(array); if(list!=null){ for(int i=0;i<list.size();i++){ System.out.print(array[list.get(i)-1]); System.out.print(" "); } }else{ System.out.print("null"); } } public static ArrayList<Integer> getMaxDiff(int[] arr) { int len = arr.length; int sum = 0; for (int i = 0; i < len; i++) sum += arr[i]; if(sum%2!=0)return null; int[][] dp = new int[len + 1][sum / 2 + 1]; ArrayList<Integer> list=new ArrayList<>(); for(int i=1;i<len+1;i++){ for(int j=1;j<sum/2+1;j++){ //if(dp[i-1][j]+arr[i-1]>dp[i-1][j]&&dp[i-1][j]+arr[i-1]<=j){ if(j-arr[i-1]>=0&&dp[i-1][j-arr[i-1]]+arr[i-1]>dp[i-1][j]){ dp[i][j]=dp[i-1][j-arr[i-1]]+arr[i-1]; }else{ dp[i][j]=dp[i-1][j]; } } } int mcount=len; if(dp[len][sum/2]!=sum/2)return null; for(int j=sum/2;j>=0;){ if(dp[mcount][j]!=dp[mcount-1][j]){ list.add(mcount); j=j-arr[mcount-1]; mcount--; }else { mcount--; } if(mcount==0){ break; } } return list; } }
相关文章推荐
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
- 一个大小为N(0<N<1000)的整数数组, 求该数组的子数组(长度大于2)为等差数列的个数?
- 一个大小为N(0<N<1000)的整数数组, 求该数组的子数组(长度大于2)为等差数列的个数?
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
- 贪心算法——输入任意一个正整数N,将其分成多个互不相同的整数,和为N,乘积最大
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 从大小为n的数组中随机选出m个整数,要求被选中的概率相同
- 笔试题:一个整数的“真数”,是将它的各个位相加得到的和。写一个函数完成一个数组按真数大小排序
- 两个数组,大小都为n,两个数组里有相同的元素,设计一个算法,找到两个数组中相同的元素
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 一个整数数组,长度为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
- 编写函数,将大小为10的数组里面的整数升序排列,并编写一个函数,使得插入一个数之后,数组里面的整数依然按照升序排列
- 一个大小为N的数组,里面是N个整数,怎样去除重复的数
- 把一个整数按大小顺序插入已排好序的数组中
- 一个整数数组,长度为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
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 问题:利用输入输出流重载实现一个整数数组的输入和输出。 要求:输入一个数组大小 及 所有元素的值,排序后输出该数组的所有元素。