论坛首页 综合技术论坛

拆解数字

浏览 18571 次
锁定老帖子 主题:拆解数字
精华帖 (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);
//			}
		}
	}
}

0 请登录后投票
   发表时间: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);
//			}
		}
	}
}


你有没有测试过你代码的速度?

0 请登录后投票
   发表时间:2011-03-18  
ggzwtj 写道


你有没有测试过你代码的速度?



求快速的解法
0 请登录后投票
   发表时间:2011-03-18  
Excalibur 写道
ggzwtj 写道


你有没有测试过你代码的速度?



求快速的解法

最快的方法是打表,其次就是求公式,再不行就动态规划,实在实在不行了,就模拟。
0 请登录后投票
   发表时间:2011-03-18  
ggzwtj 写道
Excalibur 写道
ggzwtj 写道


你有没有测试过你代码的速度?



求快速的解法

最快的方法是打表,其次就是求公式,再不行就动态规划,实在实在不行了,就模拟。

看了你那个动态规划,但题目里有这个要求

“并打印可拆解情况”
0 请登录后投票
   发表时间:2011-03-18  
ggzwtj 写道

你有没有测试过你代码的速度?


我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数
0 请登录后投票
   发表时间:2011-03-18   最后修改:2011-03-18
dongya1987 写道
ggzwtj 写道

你有没有测试过你代码的速度?


我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数


哎呀,没看清,丢人了。
不过我想了一下,其实这个也是可以用动态规划来实现了。可以用DFS生成具体的分解方法,另外可以用dp数组中的值做限制。
0 请登录后投票
   发表时间:2011-03-18  
ggzwtj 写道
dongya1987 写道
ggzwtj 写道

你有没有测试过你代码的速度?


我测试了,你的速度是最快的。但你没有完全满足楼主的题目要求,楼主要的不只是个数


哎呀,没看清,丢人了。
不过我想了一下,其实这个也是可以用动态规划来实现了。可以用DFS生成具体的分解方法,另外可以用dp数组中的值做限制。

动态规划刚刚开始看,以前不关注算法的。这个公式找起来不容易
0 请登录后投票
   发表时间:2011-03-18   最后修改:2011-03-18
悲催啊,要输出所有结果,再怎么弄都是浮云,快不起来了。200的分解方法应该是3972999029388种吧。。。。
0 请登录后投票
   发表时间:2011-03-18  
ggzwtj 写道
悲催啊,要输出所有结果,再怎么弄都是浮云,快不起来了。200的分解方法应该是3972999029388种吧。。。。

我算到40就eclipse就挂了……
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics