硬币问题(java)
问题描述:
1分2分5分三种,数量不限,组合成n⾓,共有多少种组合⽅法。
思路解析:
1. ⾸先将原问题⽤数学符号表⽰出来,为 1i+2j+3*k=n;看在其问题规模不⼤,可以考虑使⽤暴⼒破解法,三层循环解决。
2. 可以先考虑使⽤⼤⾯值的,根据⾯值⼤的进⾏分类求解(例如,将1⾓分为使⽤1个5分,2个5分或者0个5分),分类后其后⾯的情
况依旧和原情况相同,故可使⽤循环递归解决问题。
代码如下:nextint()方法
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)return1;//递归出⼝
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 Int();//输⼊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,中间为具体的各种情况。