PARTITION(number theory) ALSO Explosive number in codewars
问题出于codewars,简言之:寻找和为一个整数的的不同整数组合。https://en.wikipedia.org/wiki/Partition_(number_theory)
例如:和为6的整数组合有如下11种,
6
5 + 1
4 + 2
4 + 1 + 1
3 + 3
3 + 2 + 1
3 + 1 + 1 + 1
2 + 2 + 2
2 + 2 + 1 + 1
2 + 1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1
解法一:
为了避免重复,我们可以选择逐渐递减第一个加数,直到不小于n的一半(保持分解的数字),然后对第一个加数应用这个策略,还是以6为例:
6
5 + 1
4 + 2
3 + 3
然后对第一个加数5应用这个策略,
4 + 1
3 + 2
接着对分解4和3应用这一策略,得到如下:
6
5 + 1
4 + 1 + 1
3 + 1 + 1 + 1
2 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1
2 + 2 + 1 + 1
3 + 2 + 1
4 + 2
2 + 2 + 2
3 + 3
因为我们已经有了3+2+1,对于4而言就不在分解成3+1+2,此处的限制条件分解4不能产生比2(4后面的2)小的数字,所以只能是2+2,同理,3就不再分解了,因为分解不出比3(后面那个)还大的数了。
def exp_sum(n):
if n < 0:
return 0
if n == 0:
return 1
return help(n, 1)
def help(n, mini):
tmp = 1
if n <= 1:
return 1
for i in range(1, n/2+1):##保证n-i不小于i
if i >= mini: ##保证分解得到的数不小于后面的较小的数
tmp = tmp + help(n-i, i)
return tmp
print exp_sum(6)
当然了,这个递归的速度是很慢的,T(n) = T(n-1) + T(n-2) +...+ T(ceil(n/2)),时间复杂度是指数级别的。
解法二:
可以开辟一个大小为n的list存储已经计算的结果:
def exp_sum(n):
if n < 0:
return 0
if n == 0 or n == 1:
return 1
solution = [1] + [0]*n
for i in range(1, n):
for j in range(i, n+1):
solution[j] += solution[j-i]
return solution[n]+1
解法三:
根据维基百科上的generation function:p(k) = p(k − 1) + p(k − 2) − p(k − 5) − p(k − 7) + p(k − 12) + p(k − 15) − p(k − 22) − ... + (-1)^(k+1)*p(k − (3k^2 - k)/2) + (-1)^(k+1)*p(k − (3k^2 + k)/2)
def exp_sum(n):
solutions = [1]*(n + 1)
for i in xrange(1, n + 1):
j, k, s = 1, 1, 0
while j > 0:
j = i - (3 * k * k + k) / 2
if j >= 0:
s += (-1) ** (k+1) * solutions[j]
j = i - (3 * k * k - k) / 2
if j >= 0:
s += (-1) ** (k+1) * solutions[j]
k += 1
solutions[i] = s
return solutions[n]
参考链接:
https://en.wikipedia.org/wiki/Partition_(number_theory)
http://stackoverflow.com/questions/438540/projecteuler-sum-combinations
2015-07-15 17:03:25
PARTITION(number theory) ALSO Explosive number in codewars的更多相关文章
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数
BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...
- Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)
题目: Mr. Panda is one of the top specialists on number theory all over the world. Now Mr. Panda is in ...
- [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环
E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...
- 题解-Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...
- [Javascript] Use Number() to convert to Number if possilbe
Use map() and Number() to convert to number if possilbe or NaN. var str = ["1","1.23& ...
- Ugly Number,Ugly Number II,Super Ugly Number
一.Ugly Number Write a program to check whether a given number is an ugly number. Ugly numbers are po ...
- leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...
随机推荐
- localStorage和sessionStorage火狐浏览器和其他高级浏览器的区别
例子: <script>window.onload=function(){ var oSetData = document.getElementById('setData'); var o ...
- C盘扩容,超详细,史上最简单的扩容技术贴!
http://ideapad.zol.com.cn/55/160_549015.html 很多朋友跟我一样,转到windows 7 64bit后,发现以前所谓的35GB理论不够用了,哪怕你不把任何程序 ...
- Opencv--HoughCircles源码剖析
图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测.圆可以表示成: (x-a)2+(y-b)2=r2 ...
- Sql Server相关的性能计数器
OS Memory and Paging 性能计数器: 1.Memory\Availability Mbytes 未使用的物理内存(非页面文件),通常情况下它应该大于100MB 2.Memory\ ...
- JSP总结2 配置开发环境和firstjsp
JDK的下载 JAVA_HOME ,CLASSPATH,PATH 的配置,根据安装路径. 然后java -version检测配置OK. 编写helloworld.java 放置在同JDK 盘里.j ...
- VB.NET 结构(Structure)和类(Class)的区别
类是我们用来构造 VB.NET 应用程序时的最基本的编程结构了. 那结构与类有什么相似之处与不同之处呢? 结构和类, 相同之处是都含有成员,包括构造函数.方法.属性.字段.常量.枚举和事件,都可以实现 ...
- Core Java读书笔记之String
Java里面的String Conceptually, Java Strings are sequences of Unicode characters. Java里面的String都是Unicode ...
- 【Lucene4.8教程之二】索引
一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates ...
- JS三元运算符
语法是 条件 ? 结果1 : 结果2; 问号(?)的前面是条件:后面跟着用冒号(:)分隔的结果1和结果2;满足条件时结果1否则结果2. 例子: var a=1; a>2?a:a=3; alert ...
- Linux命令(持续更新ing)
*.命令语法: a.在进行参数设定时,通常为“-”号,若为完整参数名称,则输入“--”符号; b.指令太长的时候,可以使用“\”符号使指令连续到下一行; c.各种符号的意义: '' ...