题目:
在这插入图片描述
思路:思路是比较简单的,每种调料每次最少放一种,每种调料都有1,2,3克调料品,三种情况,结果其实就像三叉树一样。我们只需要使用递归算法来模拟一颗三叉树即可,满足美味程度的路径的值之和就是方案
代码实现:
需求:由于需要存储方案数量,那么需要一个arraylist来存储数组,还需要一个十个大小的数组来存储在递归时生成的方案。最后递归的条件就是:
首先分析一个情况,美味程度大于30,直接输出0.
在写递归算法时要注意:
1.变化的量:美味程度,存储方案数组,存储数组的arraylist
2.递归何时结束:
美味程度达到30;
当十种调料已经加好了,但是美味程度没到30,那么我们需要让其结束循环,这种方案不是目标方案
如果正好美味程度等于delicious时,那么当进入下一次递归时,让其结束
public static int counter=0;
public static void main(String[] args) {
Main a=new Main();
Scanner scanner=new Scanner(System.in);
int delicious=scanner.nextInt();
ArrayList<int[]> arrayList=new ArrayList<>();
a.f(delicious,new int[10],0,arrayList);
if(delicious>30){
System.out.println(0);
return;
}
System.out.println(counter);
for (int[] c:arrayList) {
for (int i = 0; i < 10; i++) {
System.out.print(c[i]);
if (i<9)
System.out.print(" ");
}
System.out.println("");
}
}
void f(int delicious,int[] result,int index,ArrayList<int[]> arrayList){
if (delicious<0){
return;
}
//如果正好美味程度等于delicious时,那么当进入下一次递归时,让其结束
if (delicious==0 && index==10 && !arrayList.contains(result)){
counter++;
arrayList.add(result.clone());
return;
}
if (index==10)//当十种调料已经加好了,但是美味程度没到30,那么我们需要让其结束循环,这种方案不是目标方案
return;
result[index]=1;
f(delicious-1,result,index+1,arrayList);
result[index]=2;
f(delicious-2,result,index+1,arrayList);
result[index]=3;
f(delicious-3,result,index+1,arrayList);
}