1-100中, 
求:5个不同数的和小于100的不重复组合的个数. 
求效率比较高的算法。用for循环写,是个人都会,这样效率太差了, 排除.
  先谢谢大家了!   

解决方案 »

  1.   

    GG了下,找到下面这个解法,但是还是要用到循环,
    偶没看明白什么意思,每次循环的判断哪里为什么会是那4个数值?达人解释下.
    package com.hmilyld.exp;public class NumExp { /**
     * @param args
     */
    public static void main(String[] args) {
    int total = 0;
    int num = 0;
    /**
     * 第一个数取到17
     */
    for (int i = 1; i < 18; i++) {
    /**
     * 第二个数取到23
     */
    for (int j = i + 1; j < 24; j++) {
    /**
     * 第三个数取到31
     */
    for (int k = j + 1; k < 32; k++) {
    /**
     * 第四个数取到46
     */
    for (int l = k + 1; l < 47; l++) {
    int m = 99 - i - j - k - l;
    if (m > l) {
    num++;
    total = total + (m - l);
    }
    }
    }
    }
    }
    System.out.println("总数:"+total);
    System.out.println("循环次数:"+num);
    }}
      

  2.   


    import java.util.Hashtable;
    public class ByteArrayTest { public static void main(String[] args) throws Exception{
    int all=0,satisfied=0;
    Hashtable buffer=new Hashtable();
    for(int v1=0; v1<100;v1++){
    for(int v2=(100-v1);v2>=0 && v2<=v1;v2--){
    for(int v3=(100-v1-v2);v3>=0 && v3<=v2;v3--){
    for(int v4=(100-v1-v2-v3);v4>=0 && v4<=v3;v4--){
    for(int v5=(100-v1-v2-v3-v4);v5>=0 && v5<=v4;v5--){
    if (v1+v2+v3+v4+v5<100){
    satisfied++;
    String key=v1+","+v2+","+v3+","+v4+","+v5;
    buffer.put(key,key);
    }
    all++;
    }
    }
    }
    }
    }
    System.out.println("全部循环:"+all+", 满足条件的:"+satisfied+", 排重后:"+buffer.keySet().size());
    }
    }
    全部循环:14447, 满足条件的:7168, 排重后:7168