不能选择相邻的食物(清雨这个名字取的挺好的哇)

本文探讨了两种算法问题,一是N种食物排列中不选相邻食物的方案计数,二是确定放置物品时最少所需的盒子数量。通过动态规划解决食物选择问题,利用哈希表统计物品出现频率以确定最少盒子数。

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

N种食物排成一排,可以做若干种选择,不能选择相邻的食物,可以一种都不选,不选也算一种方法。

输出他可以选择的方案次数!

栗子:

输入

3

输出

5

有三种食物,方案为1、2、3、1 3、不选,共5种。

解题思路:分为选dp与不选np两个数组,那选择第i种dp[i] = np[i-1]前一种不选,不选择第i种np[i]=dp[i-1]+np[i-1]。dp[1]=1;np[1]=1;

那总的方案res=dp[n]+np[n]。考虑到n在1-90之间,所以用long long存放方案次数不会溢出。

 int n;
 cin>>n 
 if(n<1||n>90)return 0;
 long long *dp =new long long[n+1];//选
 long long *np = new long long[n+1];//不选
 for(int i=0;i<n+1;i++)
 {
	dp[i]=0;
	np[i]=0;
 }
 dp[1]=1;
 np[1]=1;
 for(int i=2;i<n+1;i++)
 {
	dp[i]=np[i-1];
	np[i] = dp[i-1]+np[i-1];
 }
 long long res = dp[n]+np[n];
 cout<<res<<endl;
 delete []dp;
 delete []np;

最少的盒子

考虑同等情况下最多的就是最终的盒子数量

比如:4 

1 2 2 3

2数量最多,无论怎样放都会有两个

所以输出2

	int n;
	cin>>n;
	map<int,int> arr;
	for(int i=0;i<n;i++)
	{
		int t;
		cin>>t;
		int count =1;
		pair<map<int,int>::iterator, bool>p = arr.insert(pair<int, int>(t, count));//插入到map中,顺便做判断
		if (!p.second)//如果插入失败 说明存在字符
		{
				(*(p.first)).second++;
		}
	}
	vector<pair<int,int> > a(arr.begin(),arr.end());
	sort(a.begin(),a.end(),cmp);
	int len =a.size();
	cout<<a[0].second<<endl;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值