java吧 关注:1,230,585贴子:12,692,250
  • 11回复贴,共1

集合a{1,2,3,5,7,10},输出不多于4个元素(不重复)的加和

只看楼主收藏回复

集合a{1,2,3,5,7,10},输出不多于4个元素(不重复)的加和为22的组合。


IP属地:北京1楼2017-09-14 20:41回复
    有没有人能实现??


    IP属地:北京2楼2017-09-14 20:41
    回复
      你是想从里面取4个元素相加的和为22,4个元素不重复?


      IP属地:广东来自Android客户端3楼2017-09-14 20:48
      收起回复
        这种题太经典了,先百度一下啊


        IP属地:北京4楼2017-09-14 21:09
        回复
          1、判断集合中的每一个元素是否大于22(即1位数)
          2、取第一个数,分别与其后面的每个一数相加,和是否等于22 。然后取第2个数,与后面的数相加,以此类推(即两个数相加)
          3、取前两个数,分别与后面的数相加(即3个数相加)
          4、取前三个数,分别与后面的数相加(即4个数相加)


          IP属地:吉林5楼2017-09-14 21:10
          收起回复
            好像老师讲过。。


            来自Android客户端6楼2017-09-14 22:58
            收起回复
              类似背包问题?


              IP属地:广东来自Android客户端7楼2017-09-15 10:28
              回复
                2-Sum的变种,K-Sum


                IP属地:北京8楼2017-09-15 14:15
                回复
                  import java.util.*;
                  public class Main
                  {
                  public static void main(String[] args) throws Exception
                  {
                  //必须是有序的列表
                  List<Integer> list = Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14});
                  for(int number = 1; number < 5; ++number){
                  System.out.println(number+"个数 : ");
                  List<List<Integer>> results = fetchFromSet(list,number,22);
                  System.out.println("\t"+results);
                  }
                  }
                  static List<List<Integer>> fetchFromSet(List<Integer> list,int number,int summary){
                  List<List<Integer>> results = new ArrayList<>();
                  int len =list.size();
                  if(number == 1){
                  for(int i = len -1; i > 0; --i){
                  int current = list.get(i);
                  if(current < summary)
                  break;
                  if(current == summary){
                  List<Integer> choice = new ArrayList<>();
                  choice.add(current);
                  results.add(choice);
                  }
                  }
                  return results;
                  }
                  /*
                  比如从[1,2,3,5,7,10]中选4个,那么最后四个最大,
                  所以先判断最后四个的和是不是大于等于要求的数
                  如果不符合,也就不用往下比较了
                  如果符合,就先取出最后一个数,然后从[1,2,3,5,7]中取三个数
                  */
                  //直接截掉大于summary的部分
                  List<Integer> temp = new ArrayList<>( new TreeSet<>( list ).headSet(summary+1));
                  len = temp.size();
                  while(len>number && sum(temp.subList(len-number,len))>= summary ){
                  int lastElement = temp.get(len-1);
                  //因为大于summary/2的数最多一个,所以从ts.headSet(summary/2+1)中选数
                  TreeSet<Integer> ts = new TreeSet<>(temp);
                  List<Integer> exceptLast = new ArrayList<>(ts.headSet(summary/2+1));
                  for(List<Integer> tempList : fetchFromSet(exceptLast,number-1,summary-lastElement)){
                  tempList.add(lastElement);
                  results.add(tempList);
                  }
                  temp = temp.subList(0,len-1);
                  len--;
                  }
                  return results;
                  }
                  static int sum(List<Integer> s){
                  int sum = 0;
                  for(Integer i: s){
                  sum+= i;
                  }
                  return sum;
                  }
                  }


                  来自Android客户端9楼2017-09-15 17:32
                  回复