母牛的故事 | 动态规划

母牛的故事 | 动态规划

题目

在这里插入图片描述

分析

刚开始画了棵树,试图以父子关系寻找每代及其孩子的数量进而得到动态规划式。但将每年牛的数量列表后:(这里默认,第1年只有母牛1头牛)

年份数量
11
22
33
44
56
69
713

记第 i 年母牛数量为 f[i] ,则 f[i]=f[i-1]+f[i-3] 。前3年的数量我们可以提前写出来,自第四年开始调用公式即可。
这里注意,由于年数 n0<n<55,这个数量级我们可以提前将54个数组元素 f[i] 全部算出来,之后对输入直接判断即可,这会大大提高效率。

代码

#include<cstdio>


int main()
{
	int n,m;
	int i;
    int yearnum[56] = { 0 };
	yearnum[1] = 1;yearnum[2] = 2;yearnum[3] = 3;
  	for ( i = 4;i < 55;i++)
	{
		yearnum[i] = yearnum[i - 1] + yearnum[i - 3];
	}
	while (scanf("%d", &n)&&n)
	{
		printf("%d\n", yearnum[n]);
	}
}

问题记录

这里记录一个问题,在判断输入不为0时结束时,使用while (scanf("%d", &n)&&n)正常,而使用while ( scanf_s("%d", &n) != 0)评测时会 runtime error

这是因为 scanf 函数返回的是成功读入的数据项数,如scanf( %d%d ,a,b);,若 a、b 都被成功读入,则返回值为 2 ;若只有一个值成功读入,则返回值为 1 ;若都未被成功读入,则返回值为 0;若遇到错误或 end of file ,则返回值为 EOF

因此此处不能以while ( scanf_s("%d", &n) != 0)进行判断n的取值,可换作逗号表达式while ( scanf_s("%d", &n) ,n),逗号表达式返回的是最右边的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值