问题描述
多年前大学时做过的一道题,今天理发过程中无聊突然想起来,就试着重做一遍。
正题:假设你有N个空饮料瓶,规定3个空瓶可以换一瓶饮料喝,问题来了,你有的这N个空瓶可以换多少瓶饮料喝?举个例子,你有5个空瓶,先用3个空瓶换一瓶饮料喝完,就和之前剩下的2个空瓶得到3个空瓶,最后用这3个空瓶又可以换一瓶饮料喝,最后的最后剩一个空瓶,也就是5个空瓶总共能换2瓶饮料喝。
Talk is cheap, show me the code
解题思路
- 普通while循环求解
- 递归求解
- 动态规划求解
#include <iostream>
using namespace std;
//普通while循环求解
int getTheNum(int n)
{
int total = 0;
int m;
int r;
while(n>=3)
{
m = n / 3;
r = n % 3;
total += m;
n = m + r;
}
return total;
}
//递归求解
int getTheNum2(int n)
{
if (n<3)
{
return 0;
}
return n/3 + getTheNum2(n/3+n%3);
}
//动态规划求解
int getTheNum3(int n)
{
if (n<3)
{
return 0;
}
int arr[n] = {0};
for (int i = 3; i <= n; i++)
{
arr[i] = i/3 + arr[i/3 + i%3];
}
return arr[n];
}
int main()
{
int n;
cout<<"input n : ";
cin>>n;
cout<<"getTheNum : "<<getTheNum(n)<<endl;
cout<<"getTheNum2 : "<<getTheNum2(n)<<endl;
cout<<"getTheNum3 : "<<getTheNum3(n)<<endl;
return 0;
}
写在最后
这个其实很简单,写着完的,最近在重新看多年前大学学的c++,虽然工作开发用不上,还是习惯地用c++来写解决问题的代码