有一组数  100,200,30,49,34,232,500
要进行组合(就是相加) 每组的结果必须小于500  每组由几个元素加不限求组合后组数最小的且小于500 的组合。
eg:  20,30,200,400  进行组合  求组合后 组数最小的且小于500 的组合。
      应该是 20+30+200,400
      而不是  200,20+400,30

解决方案 »

  1.   

    楼主问题说的我都没读懂
    不知我的理解对否:
    已知一组数, 将这组数分成 X 组,每组的和要不大于一个给定的数 N ,求这个 X 的最小值?
      

  2.   

    int[] a=new int{100,200,30,49,34,232,500}
    List li=new ArrayList();
    a.sortArray();
    int m=0;
    for(int i=0;i<a.length;i++)
    {
       m=m+a[i];
    if(m>500)

    li.add(m-a[i]);
    }
    }
    li.add(m);
      

  3.   


    class Combination{
        private List<int[]> combination(int[] a, int m) {
            List<int[]> list = new ArrayList<int[]>();
            Combination c=new Combination();
            int n = a.length;
            boolean end = false;  
            int[] tempNum = new int[n];
            for (int i = 0; i < n; i++) {
                if (i < m) {
                    tempNum[i] = 1;
                } else {
                    tempNum[i] = 0;
                }
            }
            list.add(c.createResult(a, tempNum, m));
            int k = 0;
            while (!end) {
                boolean findFirst = false;
                boolean swap = false;
                for (int i = 0; i < n; i++) {
                    int l = 0;
                    if (!findFirst && tempNum[i] == 1) {
                        k = i;
                        findFirst = true;
                    }
                    if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
                        tempNum[i] = 0;
                        tempNum[i + 1] = 1;
                        swap = true;
                        for (l = 0; l < i - k; l++) { 
                            tempNum[l] = tempNum[k + l];
                        }
                        for (l = i - k; l < i; l++) {
                            tempNum[l] = 0;
                        }
                        if (k == i && i + 1 == n - m) {
                            end = true;
                        }
                    }
                    if (swap) {
                        break;
                    }
                }
                list.add(c.createResult(a, tempNum, m));
            }
            return list;
        }
        public int[] createResult(int[] a, int[] temp, int m) {
            int[] result = new int[m];
            int j = 0;
            for (int i = 0; i < a.length; i++) {
                if (temp[i] == 1) {
                    result[j] = a[i];
                    j++;
                }
            }
            return result;
        }
        public static void main(String[] args) {
            int[] arr={100,200,30,49,34,232,500};
            Arrays.sort(arr);
            int total=500;
            int pos=0;
            for(int i=0;i<arr.length;i++){
                if(arr[i]>=500){
                    pos=i;
                    break;
                }
            }
            int[] temp= Arrays.copyOf(arr, pos);
            System.out.println(Arrays.toString(temp));
            List<int[]> list=new ArrayList<int[]>();
            for(int i=1;i<pos;i++){
            Combination c = new Combination();
            list.addAll(c.combination(temp,i));
            }
            printResult(list,total);
        }
        
        private static void printResult(List<int[]> list,int total){
            for(int i=0;i<list.size();i++){
                int sum=0;
                for(int j=0;j<list.get(i).length;j++){
                    sum+=list.get(i)[j];
                }
                if(sum<500){
                    System.out.println(Arrays.toString(list.get(i)));
                }
            }
        }
    }办法笨了点,list存放了所有组合,所以不适合大量数据!
      

  4.   

    package com;public class Demo { /**
     * @param args
     */
    public static void main(String[] args) { int[] num = { 100, 200, 30, 49, 34, 232, 500 };
    for (int i = 0; i < 500 / 30 + 1; i++) {
    for (int j = 0; j < 500 / 34 + 1; j++) {
    for (int k = 0; k < 500 / 49 + 1; k++) {
    for (int m = 0; m < 500 / 100 + 1; m++) {
    for (int p = 0; p < 500 / 200 + 1; p++) {
    for (int b = 0; b < 500 / 232 + 1; b++) {
    for (int a = 0; a < 500 / 500 + 1; a++) {
    if (i * 30 + j * 34 + k * 49 + m * 100 + p
    * 200 + b * 232 + a * 500 <= 500)
    System.out.println("30共" + i + "个"
    + "  34共" + j + "个" + "49共" + k
    + "个" + "100共" + m + "个"
    + "200共" + p + "个" + "232共" + b
    + "个" + "500共" + a + "个");
    }
    }
    }
    }
    }
    }
    } }}
      

  5.   

    closewbq  只列出了所有的组合
    有一组数 100,200,30,49,34,232,500
    要进行组合(就是相加) 每组的结果必须小于500 每组由几个元素加不限,每个元素只能使用一次且其他组合也不能再使用了。
    求组合后组数最小的且小于500 的组合。
    这里要注意的是  组数最小  而且所有元素都必须使用过比如 上面数组 可以分成 3组  [30,49,34,100,200][232][500]
               也可以分成4组[30][49,34,100,200][232][500]
               也可以分成5组[30][49,34,100][232][500][200]
    我们想要的就是分成3组的那个组合。eg: 20,30,200,400 进行组合 求组合后 组数最小的且小于500 的组合。
      应该是 20+30+200,400
      而不是 200,20+400,30