求用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) 编辑 收藏 举报