锁定老帖子 主题:拆解数字
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-18
dongya1987 写道 实验了一下,对6的拆分中少了2+2+2这种情况 import java.util.LinkedList; /** * 将任一个数字进行拆解,例如: * * 3 = 2+1 = 1+1+1 所以3有三種拆法 * 4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五種 * 5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1 共七种 * * 随便给一个数字,对其进行拆解,并打印可拆解情况和拆解结果数。 */ public class Uncoil { public static void main(String[] args) { LinkedList<LinkedList<LinkedList<Integer>>> results = new LinkedList<LinkedList<LinkedList<Integer>>>(); LinkedList<LinkedList<Integer>> result = new LinkedList<LinkedList<Integer>>(); LinkedList<Integer> oneResult; int input = 20; for (int i = 1; i <= input; i++) { result = new LinkedList<LinkedList<Integer>>(); oneResult = new LinkedList<Integer>(); oneResult.add(i); result.add(oneResult); for (int j = i / 2; j >=1 ; j--) { LinkedList<LinkedList<Integer>> lefts = results.get(i - j - 1); for (LinkedList<Integer> left : lefts) { if (left.getLast() < j) { break; } oneResult = new LinkedList<Integer>(); oneResult.addAll(left); oneResult.add(j); result.add(oneResult); } } results.add(result); } for (LinkedList<LinkedList<Integer>> os : results) { System.out.println("====================" + os.size()); // for (LinkedList<Integer> o : os) { // System.out.println(o); // } } } } |
|
返回顶楼 | |
发表时间:2011-03-18
Excalibur 写道 dongya1987 写道 实验了一下,对6的拆分中少了2+2+2这种情况 import java.util.LinkedList; /** * 将任一个数字进行拆解,例如: * * 3 = 2+1 = 1+1+1 所以3有三種拆法 * 4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五種 * 5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1 共七种 * * 随便给一个数字,对其进行拆解,并打印可拆解情况和拆解结果数。 */ public class Uncoil { public static void main(String[] args) { LinkedList<LinkedList<LinkedList<Integer>>> results = new LinkedList<LinkedList<LinkedList<Integer>>>(); LinkedList<LinkedList<Integer>> result = new LinkedList<LinkedList<Integer>>(); LinkedList<Integer> oneResult; int input = 20; for (int i = 1; i <= input; i++) { result = new LinkedList<LinkedList<Integer>>(); oneResult = new LinkedList<Integer>(); oneResult.add(i); result.add(oneResult); for (int j = i / 2; j >=1 ; j--) { LinkedList<LinkedList<Integer>> lefts = results.get(i - j - 1); for (LinkedList<Integer> left : lefts) { if (left.getLast() < j) { break; } oneResult = new LinkedList<Integer>(); oneResult.addAll(left); oneResult.add(j); result.add(oneResult); } } results.add(result); } for (LinkedList<LinkedList<Integer>> os : results) { System.out.println("====================" + os.size()); // for (LinkedList<Integer> o : os) { // System.out.println(o); // } } } } 你有没有测试过你代码的速度? |
|
返回顶楼 | |
发表时间:2011-03-18
ggzwtj 写道 你有没有测试过你代码的速度? 求快速的解法 |
|
返回顶楼 | |
发表时间:2011-03-18
Excalibur 写道 ggzwtj 写道 你有没有测试过你代码的速度? 求快速的解法 最快的方法是打表,其次就是求公式,再不行就动态规划,实在实在不行了,就模拟。 |
|
返回顶楼 | |
发表时间:2011-03-18
ggzwtj 写道 Excalibur 写道 ggzwtj 写道 你有没有测试过你代码的速度? 求快速的解法 最快的方法是打表,其次就是求公式,再不行就动态规划,实在实在不行了,就模拟。 看了你那个动态规划,但题目里有这个要求 “并打印可拆解情况” |
|
返回顶楼 | |
发表时间:2011-03-18
ggzwtj 写道 你有没有测试过你代码的速度? 我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数 |
|
返回顶楼 | |
发表时间:2011-03-18
最后修改:2011-03-18
dongya1987 写道 ggzwtj 写道 你有没有测试过你代码的速度? 我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数 哎呀,没看清,丢人了。 不过我想了一下,其实这个也是可以用动态规划来实现了。可以用DFS生成具体的分解方法,另外可以用dp数组中的值做限制。 |
|
返回顶楼 | |
发表时间:2011-03-18
ggzwtj 写道 dongya1987 写道 ggzwtj 写道 你有没有测试过你代码的速度? 我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数 哎呀,没看清,丢人了。 不过我想了一下,其实这个也是可以用动态规划来实现了。可以用DFS生成具体的分解方法,另外可以用dp数组中的值做限制。 动态规划刚刚开始看,以前不关注算法的。这个公式找起来不容易 |
|
返回顶楼 | |
发表时间:2011-03-18
最后修改:2011-03-18
悲催啊,要输出所有结果,再怎么弄都是浮云,快不起来了。200的分解方法应该是3972999029388种吧。。。。
|
|
返回顶楼 | |
发表时间:2011-03-18
ggzwtj 写道 悲催啊,要输出所有结果,再怎么弄都是浮云,快不起来了。200的分解方法应该是3972999029388种吧。。。。 我算到40就eclipse就挂了…… |
|
返回顶楼 | |