杨俊cumt

导航

从面值为 1,4,12,21的钱币中最多取五张,产生1~n的连续的数目,问这个n有多大(华为)

//回溯法来求解这个问题

int[]  money = new int{0,1,4,12,21};

int num = 5;//五张

boolean find = false;//是否找到

int[] log = new int[num];//记录选择了哪几张,最多五张

 

public boolean comable(int n,int value){

//从剩下n张钱币中组合出价值value

  if(n>=0&& value==0){

    //还有钱币可以选择,且已经组合出了所需要的值,打印

    find = true;

    int sum = 0;

    for(int i = 0;i<5&&log[i]!=0;i++){

    sum += money[log[i]];

    System.out.print(money[log[i]]+" , ");

    }

    System.out.println("总数为:"+sum);

  }else

    //&&!find用来废除结果一样只是顺序不一样的结果

    for(int j = 0;j<5&&!find&&n>0;j++)

      if(value-money[j])>0){

        log[k++] = j;

        comable(n-1,value-money[j]);

        log[--k] = 0;

      }

  return find;

}

//如何调用

for(int i=1;comable(5,i);i++,find = false);

posted on 2010-09-10 17:05  杨俊cumt  阅读(190)  评论(0编辑  收藏  举报