1228--八目鳗烧烤店

1228–八目鳗烧烤店

题目描述

Description

八目鳗烧烤店一共有6个八目鳗,幽幽子一口能吃1到6个八目鳗,求吃完所有的八目鳗共有多少种吃法。
任意一口吃的八目鳗数量不同,就算不同的吃法。

本题无输入输出案例

Input

Output

输出一个整数,表示吃完所有的八目鳗共有多少种吃法。
不要书写任何多余的内容(例如:添加说明文字等)。

思路

如果是要解开这道题的话其实自己手算然后用cout或者是printf输出答案就行了,答案是32。
总共的吃法也就是前面的吃法+1,没什么难度

本题的代码实现


#include<iostream>
using namespace std;

int f(int n)
{
	int* dp = new int[n+1](),i,j;
	dp[0] = 0;
	dp[1] = 1;
	for (i = 2; i <= n; i++)
	{
		for (j = 1; j <i &&j<=6; j++)
		dp[i] += dp[j];

		dp[i]++;
	}
	return dp[n];
}
int main()
{
	int N;
	cout << f(6);
	return 0;
}




拓展

其实看到题目,第一反应应该是这是一道 动态规划类型 的题目,但是由于出题人的问题,没有很好的体现出来,导致本题直接死算就可以得出结果,或是直接用两个for循环就可以得出答案
这里我讲讲动态规划的分析

动态规划的分析

  1. 问题拆解
  2. 状态定义
  3. 递推方程,或是转移方程
  4. 代码实现

1.问题拆解

由题目的描述可以知道:
每次可以吃1~6个章鱼,简单的从只有两个章鱼的时候开始分析
一个章鱼只有一种吃法,而两个章鱼有两种:一口吃一个或者直接吃两个
题目的重点:
任意一口吃的八目鳗数量不同,就算不同的吃法。

  • 这也就是问题拆解最核心的部分了
    无论是多少个章鱼,我们能一下吃6口,就能一下吃1~5口,以此类推
  • 问题就拆解完毕了:我们将吃n个章鱼分成n+1个部分,

(因为数组下标是从0开始,动态规划的核心就是利用储存计算结果达到缩短时间的目的)

每个部分都分成 1~n-1个部分,也就是不同的吃法。

2.状态定义

用一个dp[n+1]的数组来储存计算结果
那么dp[ i ] ,就是吃 i 个章鱼一共有多少种方法

3.递推方程

for (i = 2; i <= n; i++)
	{
		//一下最多吃6口,吃i口总共的吃法由吃1~i-1口的吃法组成
		for (j = 1; j <i &&j<=6; j++)
		dp[i] += dp[j];

		dp[i]++;
	}
  1. 实现

这里要注意的是:我们需要给dp数组一定的初值,然后再通过for循环不断的递推出剩下的结果

#include<iostream>
using namespace std;

int f(int n)
{
	int* dp = new int[n+1](),i,j;
	dp[0] = 0;//0个章鱼只有0种吃法
	dp[1] = 1;//1个章鱼只有1种吃法
	for (i = 2; i <= n; i++)
	{
		for (j = 1; j <i &&j<=6; j++)
		dp[i] += dp[j];

		dp[i]++;
	}
	return dp[n];
}
int main()
{
	int N;
	cout << f(6);
	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值