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;