一个数组,int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 长度为11,任意5个相加等于35,要求5元素不能相连。如:1,2,3,4,5  这5个相连了(不行哦),求出所有的组合?我用二次循环还是写不出,关键是5元素不能相连不知道怎么写,想很久了,没思路。

解决方案 »

  1.   

    设置标志位,第一个和第二个之间设置一个(因为元素是有序的,你可以从小到大或者从大到小选取),第二个和第三个设置一个,依次类推    boolean b[4];
    当第一个与第二个相连(其实也就是(a[2]-a[1])==1),那么设置b[0] = true;
    当第二个与第三个相连,那么设置b[1] = true;
    依次类推 等最后结果出来时,判断该组合的b[0] & b[1] & b[2] & b[3]的结果,如果为true则将该结果抛弃。
      

  2.   

    用二次循环可以啊,每个循环里面先判断一下是不是相连,如果相连则直接continue,否则再判断相加结果,这样应该可以。
      

  3.   

    public class Test {
    public static void main(String[] args) {

    int[] a= {1,2,3,4,5,6,7,8,9,10,11};

    for(int i=0;i<a.length-4;i++){
    for(int j=i+1;j<a.length-3;j++)
    for(int k=j+1;k<a.length-2;k++)
    for(int l=k+1;l<a.length-1;l++)
    for(int m=l+1;m<a.length;m++){
    if(a[i]+a[j]+a[k]+a[l]+a[m]==35){
    if(!(j-i==1&&k-j==1&&l-k==1&&m-l==1))
    System.out.println(a[i]+" "+a[j]+" "+a[k]+" "+a[l]+" "+a[m]);
    }
    }
    }
    }
    }
      

  4.   

    假设b[5]数组表示数在a数组坐标,不连续的充要条件为 b[4]-b[0] != 4 前提 a 和 b都是有序的
      

  5.   

    一个数组,int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 长度为11,任意5个相加等于35
    你这题就有毛病,1,2,3,4,6相加也不等于35啊。你还是想说任意5个数步相连,连续的5个数相加等于35?
    错题,无解!要是你自己想的就想明白再发帖
      

  6.   

    如果是要在已知的数据中找到这样的5个数,不知我下边的建议有用没,上班中,无法给你提供代码,只能给点思路了:
    判断 a[0] + a[1] + a[2] + a[3] + a[11] 的值是否大于35  如果是就必须要将 a[11]往前退一位了,以此类推。
    找到最大的数后开始判断之前的4个数,a[3]往后进一位成a[4] 判断5个数和是否小于35 小于的话,a[3]退回去把a[2]换成a[4]再判断下。如果一直到a[0]换成a[4]还是小了的话,就将a[3]换成a[5]继续这样判断;中间具体的移位换数楼主自己可以再琢磨下。不多说了 呵呵
    上班偷着回帖,实在没时间给写代码
    4 楼的代码太暴力了   本题中是11个数好点   换成N 的话 时间复杂度就是O(N^5)了