HZNUOJ 1019 取火柴

HZNUOJ 1019 取火柴

题干
Description

有N根火柴,每次只能取1-4根,请问共有几种取法?
举一个例子,假设有3根火柴,取法有4种,分别为1+1+1,1+2,2+1,3。

Input

第一行包含一个正整数T(0<T<100),表示进行T次测试。接下来有T行,每行只有一个正整数n(1<=n<=66),代表n根火柴。

Output

对于每一个n,输出对应的取法的数量,每次输出占一行。

Samples

input Copy
3
1
2
15
output Copy
1
2
10671
原题链接http://acm.hznu.edu.cn/OJ/problem.php?id=1019

思想:由于一次只能取走1-4根,所以较容易得到取1到4根火柴时的方法数,设f(x)为当火柴数量为x时的方法数。
x=1时

  • 1
    f(1)=1

x=2时

  • 1 1
  • 2
    f(2)=2

x=3时

  • 1 1 1
  • 1 2
  • 2 1
  • 3
    f(3)=4

x=4时

  • 1 1 1 1
  • 1 1 2
  • 1 2 1
  • 2 1 1
  • 2 2
  • 1 3
  • 3 1
  • 4
    f(4)=8

当有五根火柴时,由于我们无法一次拿走五根火柴,能拿走第五根火柴的情况只有四种

  1. 先取一根火柴,然后直接再取四根
  2. 先取两根火柴,然后直接再取三根
  3. 先取三根火柴,然后直接再取两根
  4. 先取四根火柴,然后直接再取一根

由此可得f(5)=f(1)+f(2)+f(3)+f(4),同理可得规律f(x)=f(x-4)+f(x-3)+f(x-2)+f(x-1),x>=5。推到这里这题就变得非常简单啦,一个循环将数据预处理一下就能得到答案了。

#include<map>
#include<string.h>
#include<string>
#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e2;
ll a[maxn];
void init(void)
{
	a[1] = 1;
	a[2] = 2;
	a[3] = 4;
	a[4] = 8;
	for (int i = 5; i <= 66; ++i)
		a[i] = a[i - 1] + a[i - 2] + a[i - 3] + a[i - 4];
}
int main()
{
	init();
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		printf("%lld\n", a[n]);
	}
	return 0;//小卜世界第一可爱
}

注意: 数据较大,记得使用long long int,不然会WA。(狗头保命)

展开阅读全文
©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值