求用1,2,5这三个数不同个数组合的和为100的组合个数

这个题目其实很简单,直接利用dfs就出来,复杂度为O(100*50*20)可是看网上一个很好的分析,时间复杂度特别小。

分析:

   假设a*1 + b*2 + c*5 = 100;非常容易看出c的循环次数最小,那么枚举c开始

c=0, a的取值为100,98,96,94,...,4,2,0

c=1,a的取值为95,93,91,89,...,5,3,1

c=2,a的取值为90,88,86,...,4,2,1

c=3,a的取值为85,83,81,...,5,3,1

.....

c=19,a的取值为5,3,1

c=20,a的取值0

现在看出规律了吧,100以内的偶数+95以内的奇数+90以内的偶数+。。。+5以内的奇数+0以内的偶数

我们可以立即写好如下程序:

for(int i = 0; i <= 100; i += 5)

{

    sum += (m>>1) + 1;

}

时间复杂度降低了很多。所以遇到数学类题目,还是好好观察一下其中的规律。

posted on 2012-03-31 20:29  buptLizer  阅读(1955)  评论(0编辑  收藏  举报

导航