本题可以使用动态规划dp加bfs实现,其实可以在草稿纸上罗列出情况,就可以发现出其中的规律了
动态规划dp
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int dp[N];
int convert(int n){
if(n == 1)return 1;
if(n == 2)return 2;
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i <= n;i ++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
int main(){
int n;
while(cin >> n){
cout << convert(n) << endl;
}
return 0;
}
bfs实现
#include <iostream>
#include <queue>
using namespace std;
int n;
int ans = 0;
int bfs(int n){
if (n == 1) return 1;
if (n == 2) return 2;
queue<int> myqueue;
myqueue.push(n);
while(myqueue.size()){
int current = myqueue.front();
// 如果消耗完糖果了,方案加一
if(current == 0){
ans ++;
}
myqueue.pop();
for(int i = 0;i < 2;i ++){
int next = current;
if(i == 0){
next = next - 1;
}else if(i == 1){
next = next - 2;
}
if(next < 0){
continue;
}
myqueue.push(next);
}
}
return ans;
}
int main(){
while(cin >> n){
cout << bfs(n) << endl;
}
return 0;
}