一、爬楼梯
假设你正在爬楼梯,每次你可以向上爬 1 阶、2 阶或者 3 阶楼梯。给定楼梯n,求爬到n层的方式之和?
递归:
#include <iostream>
#include <vector>
using namespace std;
int floor(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
return floor(n-1) + floor(n-2)+ floor(n-3);
}
int main() {
int n;
cin >> n;
cout << floor(n) << endl;
return 0;
}
- 从递归的思路中可以看出,这是一种老板思维,也就是老板我并不需要显示的去求出floor(n-1) 、 floor(n-2)、 floor(n-3),而是假设员工已经求出了他们,然后老板只需要将其组合起来即可。而至于他们到底怎么求,老板并不关心。
迭代:
#include <iostream>
#include <vector>
using namespace std;
int floor(int n) {
if (n == 0) return 1; // 这里添加 n == 0 的情况,假设 floor(0)=1,使逻辑更完整
vector<int> dp(n + 1);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
int main() {
int n;
cin >> n;
cout << floor(n) << endl;
return 0;
}
- 迭代就是一种很明显的员工思维,即求出每一个相关的值,一步步地往上爬,最后得到想要的结果。
二、机器人走方格
一个机器人从左上角出发,走到右下角,求总共可能的路径数?
递归:
#include <iostream>
#include <vector>
using namespace std;
//机器人走路(组合问题)
int grid(int m,int n) {
if (m==1 || n == 1) return 1;
return grid(m-1,n) + grid(m,n-1);
}
int main() {
int m,n;
cin >> m>>n;
cout << grid(m,n) << endl;
return 0;
}
三、硬币表示:
现有1,5,10,20面值的硬币,求大小为n的面值可以有多少种不同的表达方式?
递归:
#include <iostream>
#include <vector>
using namespace std;
vector<int>coins = { 1,5,10,20 };
int calNum(int n, int curIndex) {
if(n<0) return 0;
if (curIndex == 0) {
if(n % coins[curIndex] == 0) return 1;
else return 0;
}
int res = 0;
for (int i = 0; i * coins[curIndex] <= n; i++) {
res += calNum(n - i * coins[curIndex], curIndex - 1);
}
return res;
}
int CountNum(int n, int curIndex) {
if (n < coins[0]) return 0;
return calNum(n, curIndex);
}
int main(void) {
int n;
cin >> n;
int num = CountNum(n, 3);
cout << num << endl;
return 0;
}
迭代:
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
vector<int>coins = { 1,5,10,20 };
int main(void) {
int n;
cin >> n;
vector<vector<int>>dp(4, vector<int>(MAX, 0));
for (int i = 0; i < 4; i++) dp[i][0] = 1;
for (int i = 0; i <= n; i++) dp[0][i] = 1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j <= n; j++) {
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = 1; i < 4; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k * coins[i] <= j; k++) {
dp[i][j]+=dp[i-1][j-k*coins[i]];
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j <= n; j++) {
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << dp[3][n] << endl;
return 0;
}