请大家指教~~~能实现功能就行,当然效率越高就更好了,谢谢!

解决方案 »

  1.   

    比如说:for循环class test
    {
    public static void main(String[] args) 
    {
        int sum=0;
        for(i=1;i<=10;i++
                {
                    for(j=1;j<=10;j++)
                    {
        for(k=1;k<=10;k++)
                        {
    ....        //要有10个for循环以上
                            sum = i + j + k + ... ;
                            if(sum==100)
    System.out.println(i+" "+j+" "+k+" "+...);
                        }                }
                }
    }
    }
      

  2.   

    class test
    {
    public static void main(String[] args) 
    {
         int sum=0;
         for(i=1;i<=10;i++
                 {
                     for(j=1;j<=10;j++)
                     {
         for(k=1;k<=10;k++)
                         {
     ....        //要有10个for循环以上
                             sum = i + j + k + ... ;
                             if(sum==100)
     System.out.println(i+" "+j+" "+k+" "+...);
                         }                 }
                 }
    }
    }
      

  3.   

    如果只求一种结果,用回溯法就可以了
    给个例子,只求一种解
    本例子可修改求多种解,即把每次找到结果后并不退出循环,而是保存到一个List<List<Integer>>结果中,直到无法找到结果为止,这里偷懒就不做了
    import java.util.*;
    public class Test {  
        public static void main(String[] args) throws Throwable {
            List<Integer> list = getCombine(Arrays.asList(new Integer[]{2,4,5,6,7,9}), 100);
            if (list.size() > 0) {
                System.out.println(list);
            } else {
                System.out.println("no result.");
            }
        }    public static List<Integer> getCombine(List<Integer> list, int sum) {
            List<List<Integer>> used = new ArrayList<List<Integer>>(); //记录某个位置用过的数字
            List<Integer> result = new ArrayList<Integer>(); //结果
            Collections.sort(list); //多个数字从小到大排列好
            int index = 0;
            int remain = sum, last;
            while (remain > 0) { //剩余的和>0一直循环
                index++;
                if (used.size() < index) {used.add(new ArrayList<Integer>());}            List<Integer> valid = new ArrayList<Integer>(list); //有效数字
                valid.removeAll(used.get(index-1)); //去掉某个位置使用过的数字
                if (valid.size() == 0) { //如果都使用过了
                    if (index == 1) {
                        break;
                    }
                    used.get(index-1).clear(); //当前位置使用过的数字清空
                    if (result.size() > 0) {
                        last = result.remove(result.size()-1); //结果的最后一个数字去掉
                        remain += last; //把去掉的数字还原回原来的和
                        used.get(index-2).add(last); //当前位置的上一个位置追加使用过的数字
                    }
                    index -= 2;
                    continue;
                }            last = valid.get(valid.size()-1); //获取有效数字的最大数字
                //last = valid.get((int)(Math.random()*valid.size())); //随即获取有效数字
                result.add(last); //获取的数字保存到结果集
                remain -= last; //剩余的和
                if (list.contains(remain)) { //如果剩余的和刚好也在数字集合中
                    result.add(remain); //则获取结果,并退出循环
                    break; //获取结果后可以不退出,继续寻找下一种结果,当然要做一些额外的恢复处理
                } else if (remain < list.get(0)) { //如果剩余的和没法用集合的数字求和得到
                    remain += last; //则恢复剩余的和
                    result.remove(result.size()-1);//并把结果集最后的一个数组去掉
                    index--;
                    used.get(index).add(last); //并在当前位置记录使用过的数字
                }
            }        return result;
        }
    }
      

  4.   

    贪心算法不知道可行,这个丢的时间太长,抽出总和小于100的是可以,呵呵
    --signature--------------------
    http://www.lunwenwa.com/
      

  5.   

    以前好像给你回答过一次http://topic.csdn.net/u/20111108/15/9a1e8642-b4c1-4d0c-85aa-c3d99b485015.html
      

  6.   


    我了个去,要是给你100个数组成10000是不是要写10000个for?
      

  7.   

    我不会贪心算法,不过你可以试试这个import java.util.Vector;public class SelectCombinations
    {
    private int [] data;
    private int condition;
    private Vector<String> vresult = new Vector<String>();

    public SelectCombinations(int [] source, int cond)
    {
    data = source;
    condition = cond;
    }

    private void selectCombination(int startIndex, int cout, int sum, String expression)
    {
    if (cout==1 && sum+data[startIndex]==condition)
    {
    String s = expression + "+" + data[startIndex] + "=" + condition;
    vresult.add(s.substring(1));
    return;
    }
    for (int i=startIndex+1; i<data.length; i++)
    if (i+cout-1 <= data.length)
    selectCombination(i, cout-1, sum+data[startIndex], expression + "+" + data[startIndex]);
    else
    break;
    }

    public void selectAllCombinations()
    {
    for (int startIndex=0; startIndex<data.length; startIndex++)
    for (int cout=1; cout<=data.length-startIndex; cout++)
    selectCombination(startIndex, cout, 0, "");
    }

    public void display()
    {
    System.out.print("从数组{");
    for (int i=0 ; i<data.length; i++)
    if (i != data.length-1)
    System.out.print(data[i]+ ",");
    else
    System.out.print(data[i]+ "}");
    System.out.println("里选出和等于" + condition + "的组合有");
    for (int i=0; i<vresult.size(); i++)
    System.out.println("第" + i + "种结果:" + vresult.get(i)); 
    }

    public static void main(String [] args)
    {
    int [] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//自行添减
    int cond = 48;//sum条件
    SelectCombinations sc = new SelectCombinations(arr, cond);
    sc.selectAllCombinations();
    sc.display();
    }
    }
      

  8.   


    import java.util.Vector;public class SelectCombinations
    {
    private int [] data;
    private int condition;
    private Vector<String> vresult = new Vector<String>();

    public SelectCombinations(int [] source, int cond)
    {
    data = source;
    condition = cond;
    }

    private void selectCombination(int startIndex, int cout, int sum, String expression)
    {
    if (cout==1 && sum+data[startIndex]==condition)
    {
    String s = expression + "+" + data[startIndex] + "=" + condition;
    vresult.add(s.substring(1));
    return;
    }
    for (int i=startIndex+1; i<data.length; i++)
    if (i+cout-1 <= data.length)
    selectCombination(i, cout-1, sum+data[startIndex], expression + "+" + data[startIndex]);
    else
    break;
    }

    public void selectAllCombinations()
    {
    for (int startIndex=0; startIndex<data.length; startIndex++)
    for (int cout=1; cout<=data.length-startIndex; cout++)
    selectCombination(startIndex, cout, 0, "");
    }

    public void display()
    {
    System.out.print("从数组{");
    for (int i=0 ; i<data.length; i++)
    if (i != data.length-1)
    System.out.print(data[i]+ ",");
    else
    System.out.print(data[i]+ "}");
    System.out.println("里选出和等于" + condition + "的组合有");
    for (int i=0; i<vresult.size(); i++)
    System.out.println("第" + i + "种结果:" + vresult.get(i)); 
    }

    public static void main(String [] args)
    {
    int [] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//自行添减
    int cond = 48;//sum条件
    SelectCombinations sc = new SelectCombinations(arr, cond);
    sc.selectAllCombinations();
    sc.display();
    }
    }