动态规划—Problem D
题意
有一组数,它们的共同特征是它们的因数只含2,3,5,7,有5842个数,要求输入一个数输出对于位置的数是多少。
解题思路
分析题意,要做的事就是求出所有这些符合条件的数,然后输出就不难了。若一个数是Humble数,则它的2、3、5、7倍仍然是Humble数。设dp[i]为第i个Humble数,则dp[t] = min(2*dp[num2], 3*dp[num3], 5*dp[num5], 7*dp[num7]), num2、num3、num5、num7在不断更新。
感想
让人抓狂的题目,比较烦。提交前几次时提示超时,然后全部改成了c语言并且减少了for循环,可是还是有问题,继续改改改,呵呵。这样的DP,我服。
AC代码
#include<stdio.h>
#define NUM 5842
int Min(int a, int b, int c, int d)
{
int Min1 = a < b ? a : b;
int Min2 = c < d ? c : d;
return Min1 < Min2 ? Min1 : Min2;
}
int main()
{
int dp[NUM];
int t,num2,num3,num5,num7;
dp[1] = 1;
num2 = num3 = num5 = num7 = 1;
int m = 1;
while(m <= 5842)
{
int temp = Min(2*dp[num2], 3*dp[num3], 5*dp[num5], 7*dp[num7]);
dp[++m] = temp;
if(temp == 2*dp[num2]) num2++;
if(temp == 3*dp[num3]) num3++;
if(temp == 5*dp[num5]) num5++;
if(temp == 7*dp[num7]) num7++;
}
while( scanf("%d",&t), t)
{
if(t%10==1&&t%100!=11)
printf("The %dst humble number is %d.\n",t,dp[t]);
else if(t%10==2&&t%100!=12)
printf("The %dnd humble number is %d.\n",t,dp[t]);
else if(t%10==3&&t%100!=13)
printf("The %drd humble number is %d.\n",t,dp[t]);
else
printf("The %dth humble number is %d.\n",t,dp[t]);
}
return 0;
}