本题是一到不是那么典型的DP题目,其状态转移为第i个数乘上2,3,5,7,后刚好大于dp[i-1]的数中的最小者。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[6000];
int main()
{
int two = 1,three = 1,five = 1,seven = 1;
dp[1] = 1;
for(int i = 2; i < 6000; i++)
{
dp[i] = min(min(dp[two] * 2, dp[three] * 3), min(dp[five] * 5, dp[seven] * 7));
if(dp[i] == dp[two] * 2) two++;
if(dp[i] == dp[three] * 3) three++;
if(dp[i] == dp[five] * 5) five++;
if(dp[i] == dp[seven] * 7) seven++;
}
int n;
while(cin >> n and n != 0)
{
if(n % 100 == 11 || n % 100 == 12 || n % 100 == 13)
{
cout << "The " << n << "th humble number is " << dp[n] << '.' << endl;
continue;
}
else switch(n % 10)
{
case 1:
{
cout << "The " << n << "st humble number is " << dp[n] << '.' << endl;
break;
}
case 2:
{
cout << "The " << n << "nd humble number is " << dp[n] << '.' << endl;
break;
}
case 3:
{
cout << "The " << n << "rd humble number is " << dp[n] << '.' << endl;
break;
}
default:
{
cout << "The " << n << "th humble number is " << dp[n] << '.' << endl;
}
}
}
return 0;
}