这个倒是有点记忆化搜索的意思了。
用 d[n] 表示面值为 n 的货币去银行兑换的话最多能得到多少钱,那么d[n] = max(n, dfs(n/2)+dfs(n/3)+dfs(n/4))。这里 n 的范围是1000000000,范围太大无法开出这么大的数组,所以就只开了40000000的数组,在40000000范围内记忆化,超出40000000的直接裸搜。
#include <iostream>
using namespace std;
typedef long long ll;
ll d[40000000];
ll n;
ll dfs(ll n)
{
if (n <= 3)
return n;
if (n < 10000000 && d[n])
return d[n];
if (n < 10000000)
return d[n] = max(n, dfs(n/2)+dfs(n/3)+dfs(n/4));
else
return max(n, dfs(n/2)+dfs(n/3)+dfs(n/4));
}
int main()
{
int t;
cin>>t;
while (t > 0)
{
t--;
cin>>n;
cout<<dfs(n)<<endl;
}
return 0;
}