package test;public class BeibaoDemo {
static int a[]=new int[7];
static int b[]=new int[7];
static int flag=0;
static int bound=17;
static int totle=0; /**
 * @param args
 */
public static void inserttry(int i,int leftbound,int t){
if(i<7&&leftbound<=totle){
if(a[i]<leftbound){
b[t++]=a[i];
leftbound=leftbound-a[i];
totle=totle-a[i];
i++;
inserttry(i,leftbound,t);
}else if(a[i]>leftbound){
totle=totle-a[i];
i++;
inserttry(i,leftbound,t);
}else{
b[t]=a[i];
return;
}
}else{
leftbound=leftbound+b[--t];
for(int f=0;f<7;f++){
if(a[f]==b[t]){
flag=++f;
break;
}
}
b[t]=0;
totle=0;
for(int m=flag;m<7;m++)
totle=totle+a[m];
inserttry(flag,leftbound,t);
}
return;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
a=new int[]{14,26,5,30,0,-2,108};
for(int i=0;i<7;i++)
b[i]=0;
for(int i=0;i<7;i++)
totle+=a[i];
inserttry(0,17,0);
for(int i=0;i<b.length;i++)
System.out.print(b[i]+"  "); }}
=============
抛出的异常Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at test.BeibaoDemo.inserttry(BeibaoDemo.java:30)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:41)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:24)
at test.BeibaoDemo.inserttry(BeibaoDemo.java:20)
at test.BeibaoDemo.main(BeibaoDemo.java:52)

解决方案 »

  1.   

    还有这个程序:实现打印出从5个数中选择3个的所有组合,为什么没有成功实现?只打印出7种结果?那个地方需要改进?package test;
    import java.util.*;public class CombinationDemo { /**
     * @param args
     */
    public static int[] toArray(int arr[],int m){
    int []array=new int[m];
    int j=0;
    for(int i=0;i<arr.length;i++){
    if(arr[i]==1){
    array[j]=i+1;
    j++;
    }
    }
    return array;
    }
    public static List<int[]> combination(int m){
    List<int []> list=new ArrayList<int []>();
    int arr[]=new int[5];
    for(int i=0;i<m;i++)
    arr[i]=1;
    for(int i=m;i<arr.length;i++)
    arr[i]=0;
    int array[]=toArray(arr,m);
    list.add(array);
    for(int i=0;i<arr.length-1;i++){
    if(arr[i]==1&&arr[i+1]==0){
    arr[i]=0;
    arr[i+1]=1;
    array=toArray(arr,m);
    list.add(array);
    i=-1;
    }
    }
    return list;
    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<int []> list=new ArrayList<int []>();
    list=combination(3);
    Iterator it=list.iterator();
    while(it.hasNext()){
    int[] arr=(int [])it.next();
    for(int i=0;i<arr.length;i++)
    System.out.print(arr[i]+"  ");
    System.out.println();
    } }}
      

  2.   

    第一个问题明显是发生了数组越界的问题,前七次循环执行完毕后i=7,t=1,执行第八次循环时执行else里面的语句,此时把t的值变为0,执行完毕后,inserttry(flag,leftbound,t)中flag=5,leftbound=-9,t=0,因为数组a中没有值会等于leftbound,所以,当执行到i=7时,它会再次执行else里的语句,此时t的值变为-1,所以报了空指针异常的错误。
      

  3.   

    在i还不等于7时,就会转到else中执行吧,因为在进行到-2时已经产生满足条件的了。我就是按照一个程序改写的,那个程序是5个数,我把它改为7个,然后错误就不断了。我贴一下那个程序。package test;public class Beibao {
    static int[] a = new int[5]; // 背包重量
    static int[] b = new int[5]; // 结果数组
    static int flag = 0; // 下一个候选项
    static int bound = 20; // 总重量
    static int totle = 0; // 每次选择后的总重量
    /**
     * 背包
     * 
     * @param i
     *            元素坐标
     * @param leftbound
     *            目标重量
     * @param t
     */
    public static void inserttry(int i, int leftbound, int t){
    if (i < 5 && leftbound <= totle) {
    if (a[i] < leftbound) { // 当前的所选的数小于已选数的总和,将当前所选的数放入结果数组,从目标重量减掉当前所选数,递归,选择后的重量数减掉当前所选数
    b[t++] = a[i];
    totle = totle - a[i];
    leftbound = leftbound - a[i];
    i++;
    inserttry(i, leftbound, t);
    } else if (a[i] > leftbound) { // 当前的所选的数大于已选数的总和,不符合条件,选择后的重量数减掉当前所选数,递归
    totle = totle - a[i];
    i++;
    inserttry(i, leftbound, t);
    } else { // 当前所选的数等于已选数的总和
    b[t] = a[i];
    return;
    }
    } else { // 数组中没有符合当前条件的元素,将前一个数值移除,递归
    leftbound = leftbound + b[--t];
    for (int f = 0; f < 5; f++) {
    if (a[f] == b[t]) {
    flag = ++f;
    break;
    }
    }
    b[t] = 0;
    totle = 0;
    for (int m = flag; m < 5; m++) {
    totle += a[m];
    }
    inserttry(flag, leftbound, t);
    }
    return;
    }
    public static void main(String[] args) {
    a[0] = 11;
    a[1] = 8;
    a[2] = 6;
    a[3] = 7;
    a[4] = 5;
    for (int i = 0; i < 5; i++) {
    b[i] = 0;
    }
    for (int i = 0; i < 5; i++) {
    totle += a[i];
    }
    inserttry(0, 20, 0);
    for (int i = 0; i < 5; i++) {
    System.out.println(b[i]);
    }
    }
    }
    这个跟我的除了把5改为7,都没变,为什么我的会报越界异常?
      

  4.   

    如何没算错的话,在进行完-2时,各个值为 i=6,leftbound=5,totle=108,它并不会走else的语句啊,它会继续执行if(i<7&&leftbound<=totle){}的语句,然后i=7时,才执行else的语句,随着--t的不断执行,发生了数组越界的问题。