UVA 11375 - Matches (数学——递推)

本文介绍了如何通过递归方法解决火柴组合问题,即使用给定数量的火柴(0-6根)来形成非负整数(0-9),并考虑了火柴是否必须全部用完的条件。文章提供了Java代码实现,演示了如何通过状态转移矩阵来求解最大可能的整数组合,并特别关注了高精度运算以应对可能产生的大数值问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2370

 

题意:用n跟火柴能组成多少个非负整数,其中火柴不必用完。其中

0——6根火柴

1——2根火柴

2——5根火柴

3——5根火柴

4——4根火柴

5——5根火柴

6——6根火柴

7——3根火柴

8——7根火柴

9——6根火柴

题解:采用递推,从前到后依次添加数字,注意当为0的时候不能添加0。

从状态i到状态i+c[x],c[x]表示数字x需要的火柴数。

还有一点要注意的是,数字可能非常大,所以要用高精度来做。

 

AC代码:(Java)

import java.util.Scanner;
import java.math.*;

public class Main
{
	static final int N=2010;
	static Scanner cin=new Scanner(System.in);
	static BigInteger one=BigInteger.ONE,zero=BigInteger.valueOf(0);;
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		BigInteger []d=new BigInteger[N];
		BigInteger []f=new BigInteger[N];
		int []c=new int[11];
		c[1]=2;
		c[7]=3;
		c[4]=4;
		c[2]=c[3]=c[5]=5;
		c[0]=c[6]=c[9]=6;
		c[8]=7;
		
		for(int i=1;i<N;i++)
			d[i]=zero;
		d[0]=one;
		
		for(int i=0;i<N;i++)
			for(int j=0;j<10;j++)
				if(!(i==0&&j==0)&&(i+c[j])<=2000)
				{
					d[i+c[j]]=d[i+c[j]].add(d[i]);
				}
		f[0]=zero;
		for(int i=1;i<=2000;i++)
			f[i]=f[i-1].add(d[i]);
		while(cin.hasNext())
		{
			int n=cin.nextInt();
			if(n<6)
				System.out.println(f[n]);
			else
				System.out.println(f[n].add(one));//n大于6时,包括0,所以要加一
		}
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值