信息学奥赛一本通——1316:【例4.6】数的计数(Noip2001)

本文介绍了一道涉及递归的编程题,计算给定自然数n满足特定条件的数的生成方案总数,提供了C++代码示例。

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

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 37038     通过数: 15941

题目:

【题目描述】

我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:

不作任何处理;

在它的左边加上一个自然数,但该自然数不能超过原数的一半;

加上数后,继续按此规则进行处理,直到不能再加自然数为止。

【输入】

自然数n(n≤1000)

【输出】

满足条件的数。

【输入样例】

6

【输出样例】

6

【提示】

【样例解释】

满足条件的数为如下所示:

   6
  16
  26
 126
  36
 136

---------------------------------------------------------------------------------------------------------------------------------

思路:

这是一道递归题。废话,这道题都在递归的标签里

那要怎么做呢?

我们想一下,6的方案总数是多少呢?

是1 + 3的方案总数 + 2的方案总数 + 1的方案总数

为什么呢?

首先,6是不是本身就是一个方案?为什么?因为我们可以不作任何处理

所以,首先要加1

为什么要加3的方案总数呢?

因为6的前面可以加上3,3还可以继续往前加上2、1

加上3会多出多少种方案?当然是3的方案总数种

同样的道理,我们还需要加上2的方案总数、1的方案总数

因此,我们可以找出递推式:

f(n)=1+   f(1)+f(2)+f(3)+……+f(n/2)

---------------------------------------------------------------------------------------------------------------------------------

代码:

知道思路,代码就很好写了

#include<bits/stdc++.h>
#pragma GCC optimize(3)//解释一下,这个东西叫O3优化,可以帮助我们加速代码 
using namespace std;
int main(){
	long long dp[1010];//用数组dp来存储某个数的方案总数
	//dp[i]表示i的方案总数 
	dp[1]=1;//1的方案总数为1 
	int n;
	cin>>n;//读入 
	for(int i=2;i<=n;i++){
	//解释一下为什么循环要从2到n,因为我们算2加到n/2需要知道2、3、……n/2的方案总数
	//所以我们需要从2算到n,这样才能正确算出n的方案总数 
		long long cnt=1;//因为6本身就是6的一种方案,所以直接加1 
		for(int j=1;j<=i/2;j++){//从1加到i/2 
			cnt+=dp[j];//加起来 
		}
		dp[i]=cnt;//cnt就是i的方案总数,所以直接存起来
		//我们用数组存储结果,可以避免超时 
	}
	cout<<dp[n];//输出答案 
    return 0;
}

没听懂可以在评论区问,或者问chatGPT

论怎么用chatGPT帮你写代码_ptyz306的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值