8.1 枚举 dp 全排列 组合 递推

昆虫繁殖


#include<bits/stdc++.h>
using namespace std;
long long c[55];
long long l[55];

int main()
{
	c[0]=1;//第1个月有1对成虫 
	l[0]=0;//第1个月有0对卵 
	int x,y,z;
	cin>>x>>y>>z;
	for(int i=1;i<=z;i++)
	{
		if(i-x>=0)//防止数组越界
		{
			l[i]=c[i-x]*y;//第i个月的卵数=成虫每过x个月的产卵数 
		}
		c[i]=c[i-1];//无论是否有新的成虫产生,成虫数量都先等于它上个月的成虫数量 
		if(i>=2)//如果月数>2 
		{
			c[i]+=l[i-2];//加上两个月前卵的数量,即新的成虫 
		}
	}
	cout<<c[z];
}

位数问题

#include<bits/stdc++.h>
using namespace std;
long long arr[1005][2]; 
int main()
{
	int n;
	cin>>n;
	arr[1][0]=1;arr[1][1]=8;//0代表奇数3个数,1代表偶数3个数 注意个数为0也算偶数 
	for(int i=2;i<=n;i++)
	{
		arr[i][0]=(arr[i-1][0]*9+arr[i-1][1])%12345;//奇数3个数=上一位奇数个数*9+上一位偶数个数 
		arr[i][1]=(arr[i-1][0]+arr[i-1][1]*9)%12345; //偶数3个数=上一位奇数个数+上一位偶数个数*9 
	}
	cout<<arr[n][1];
}

放苹果

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int m,n;
 }arr[105];
 
int apple(int m,int n)
{
	if(m==0||n==1)//特判:如果苹果数为0或只剩1个盘子,返回1 
	{
		return 1;
	}
	else if(m<n)//如果苹果数小于盘子数,这和苹果数等于盘子数的情况是一样的 
	{
		return apple(m,n-1);
	}
	else
	{
		return(apple(m-n,n)+apple(m,n-1));
		//如果苹果数>=盘子数,有两种情况 加起来是所有不重不漏的情况 
//		1 将每个盘子都放1个苹果,再继续考虑(没空盘子) 
//		2 取掉1个盘子再继续考虑 (有空盘子) 
	}
}

int main()
{
	int t;
	cin>>t;
	for(int i=0;i<t;i++)
	{
		cin>>arr[i].m>>arr[i].n;
		cout<<apple(arr[i].m,arr[i].n)<<endl;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值