题目:http://www.nocow.cn/index.php/Translate:USACO/stamps
邮票数可以显示最大连接自然数的问题,看到这道题目第一个想到的是整数划分问题。但是又很不一样。第一它不用考虑这个整数的所有划分情况,而是只要考虑整数是否可以被<=K个邮票表示。
最简单的想法,用stamp【N】数组表示邮票,然后递增考虑1到K*stamp【N】范围的自然数的划分,直到不能划分为止。为了加速我们可以对邮票面值先做一下排序,但是还是超时了。代码如下:
很可惜的是,在TEST11的时候,有一点小的超时。
但是仔细考虑一下这道题目,发现这道题实际上可以用动态规划的思想来解决。
动态规划的题目,用F[i]表示得到i面值所需要的最少邮票个数,Value[j](j=1..Stamps)表示每个邮票的面值,可得以下转移方程:
F[i]=Min ( F[i-Value[j]] + 1 ) (i-Value[j]>=0 j=1..Stamps)
初始状态:F[0]=0;F[i]=INFINITE;
如果计算中间某个F[i]大于了最大可以使用的邮票数量,则退出循环,输出i-1即为解。----引自USACO解答
这样子的话,这道题目就不难解决了。代码如下:
运行时,顺利通过了,只不过内存翻了一倍。
这道题上USACO上,还提供了BFS算法,速度更快。大家可以到官网上去好好看一下。