问题描述:
1分2分5分三种,数量不限,组合成n角,共有多少种组合方法。
思路解析:
- 首先将原问题用数学符号表示出来,为 1i+2j+3*k=n;看在其问题规模不大,可以考虑使用暴力破解法,三层循环解决。
- 可以先考虑使用大面值的,根据面值大的进行分类求解(例如,将1角分为使用1个5分,2个5分或者0个5分),分类后其后面的情况依旧和原情况相同,故可使用循环递归解决问题。
代码如下:
import java.util.Scanner;
public class Ybwt {
//硬币问题
//1分2分5分三种,数量不限,组合成n角,共有多少种组合方法
//暴力破解与循环递归破解
static int baoli(int a)//暴力破解
{
int count=0;
for(int i=0;i<=a/5;i++)
for(int j=0;j<=a/2;j++)
for(int k=0;k<=a;k++)
if(5*i+2*j+k==a)
{
count++;
System.out.print(i+" ");//输出具体情况
System.out.print(j+" ");
System.out.println(k);
}
return count;
}
static int rec(int a,int []b,int c)//递归解决
{
if(c==0) return 1;//递归出口
int count=0;
for(int i=0;i<=a/b[c];i++)
{
count+=rec(a-i*b[c],b,c-1);
}
return count;
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);
int b=a.nextInt();//输入n
int c=baoli(b);
System.out.println(c);
int []d={1,2,5};
int f=rec(b,d,d.length-1);
System.out.println(f);
}
}
其运行结果如下:
可以看出当n=10时,两种方法解都为10,中间为具体的各种情况。