论坛首页 Java企业应用论坛

对于这个题目,看看大家有什么效率更高的算法

浏览 16813 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-18  
lovemylover 写道
这样够简单吧,两层循环,但是效率嘛,O(n^2)了。因为你是求所有解法,而不是求解法数量
#include <stdlib.h>
#include <stdio.h>

int main(int argc,char** argv)
{
	int n=1000,a=1,b=2,c=3;
	int num1,num2,num3,sum1,i,j;
	num1=(int)(n/c);
	for(i=0;i<=num1;i++)
	{
		sum1=n-i*c;
		num2=(int)(sum1/b);
		for(j=0;j<=num2;j++)
		{
			num3=sum1-j*b;
			if((num3 % a)==0)
			{
				printf("%d*%d + %d*%d + %d*%d = %d\n",i,c,j,b,num3/a,a,n);
			}
		}
	}
	return 0;
}

你的这段代码有调试过吗?你的这种方式就是线性方程。要返回走法的意思是:比如n=3时,应该打印出:
1111
12
21
3
这种格式
0 请登录后投票
   发表时间:2010-10-18  
恩,差不多吧,我没怎么看你的解法,说句实话太多太乱了。排除递归之外,我实在没有想出更好的解法。线性规划的有些解法实现起来太复杂,就没有去尝试了,所以也不知道那种解法的时间复杂度怎么样
0 请登录后投票
   发表时间:2010-10-18   最后修改:2010-10-18
lovemylover 写道
恩,差不多吧,我没怎么看你的解法,说句实话太多太乱了。排除递归之外,我实在没有想出更好的解法。线性规划的有些解法实现起来太复杂,就没有去尝试了,所以也不知道那种解法的时间复杂度怎么样

呵呵,我写的是java,是面向对象的思想,封装了包括走法的种数,要返回给调用者的结果集等等,可以通过new一个对象,然后调用walkStep()方法就可以得到走法的具体的结果集和结果的种数。你上面的代码只是简单的打印,而且不能动态修改n的大小,当然比较简单。你也可以尝试一下用C语言写一个可以得到结果集种数和所有走法的具体情况,并且这些结果能被调用方法使用和处理的程序。你不妨再把你的程序修改一下,我调了一下,好像不符合要求:
0*3 + 0*2 + 10*1 = 10
0*3 + 1*2 + 8*1 = 10
0*3 + 2*2 + 6*1 = 10
0*3 + 3*2 + 4*1 = 10
0*3 + 4*2 + 2*1 = 10
0*3 + 5*2 + 0*1 = 10
1*3 + 0*2 + 7*1 = 10
1*3 + 1*2 + 5*1 = 10
1*3 + 2*2 + 3*1 = 10
1*3 + 3*2 + 1*1 = 10
2*3 + 0*2 + 4*1 = 10
2*3 + 1*2 + 2*1 = 10
2*3 + 2*2 + 0*1 = 10
比如结果的第二行:只能表明有一次是走两个台阶,另外八次是每次走一个台阶。而具体怎么走,没有详细的罗列出来。顺便提一句你的方程就是:x+2y+3z=n,就是线性规划的思想,而不是递归。
0 请登录后投票
   发表时间:2010-10-18  
这个题目有点像一大个图形中找有几小个图形一样
0 请登录后投票
   发表时间:2010-10-18  
fuliang 写道
kimmking 写道
ray_linn 写道
线性方程组而已,学点数学就成了


3阶斐波拉契数列

正解。
f(n) = f(n-1) + f(n-2) + f(n-3)
f(1) = 1
f(2) = 2
f(3) = 4
ruby代码:
自底向上递推动态规划算法:

def f(n)
f = [1,2,4,7]
return f[n] if n < 4
4.upto(n) do
    f[3] = f[0] + f[1] + f[2]
    f[0], f[1], f[2] = f[1], f[2], f[3]
end
return f[3]
end

呵呵,高手啊
0 请登录后投票
   发表时间:2010-10-18  
消除递归,用循环
package Staticsteps;

import java.util.ArrayList;
import java.util.List;

public class ResultNode {
	private  ArrayList<ArrayList<Integer>> resultList =null;
	public ResultNode(){
		resultList = new  ArrayList<ArrayList<Integer>>();
	}
	
	public ArrayList<ArrayList<Integer>> getResultList(){
		return resultList;
	}
}


package Staticsteps;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class Staticsteps {

    public static void main(String[] args){
        
        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt();
        System.out.println("The result roads is :");
        long startTime = System.currentTimeMillis();
        if (k>0)
            print(getResultRoad(k));
        long endTime = System.currentTimeMillis();
        System.out.println("Totally using "+(endTime-startTime)+" milliseconds");
    }
    
    public static ResultNode[] getResultRoad(int k){
        ResultNode[] result = null ;
        result = new ResultNode[k+1]; 
        
        //f(n)=f(n-3)+f(n-2)+f(n-1)
        for(int i = 0;i<k+1;i++){
            int m =0;
            result[i] = new ResultNode();
            if(i==0){
                ArrayList<Integer> alist = new ArrayList<Integer>();
                alist.add(0);
                result[0].getResultList().add(alist) ;
            }
            if(i-1>=0){//求f(n-1)
                while(result[i-1]!=null
                        &&result[i-1].getResultList().size()>0
                        &&m<result[i-1].getResultList().size()){
                    
                    ArrayList<Integer> p = (ArrayList<Integer>) result[i-1].getResultList().get(m).clone();
                    p.add(i);
                    result[i].getResultList().add(p);
                    m++;
                }
                m=0;
            }
            
            if(i-2>=0){//求f(n-2)
                while(result[i-2]!=null
                        &&result[i-2].getResultList().size()>0
                        &&m<result[i-2].getResultList().size()){
                    
                    ArrayList<Integer> q = (ArrayList<Integer>) result[i-2].getResultList().get(m).clone();
                    q.add(i);
                    result[i].getResultList().add(q);
                    m++;
                }
                m=0;
            }
            
            if(i-3>=0){//求f(n-3)
                while(result[i-3]!=null
                        &&result[i-3].getResultList().size()>0
                        &&m<result[i-3].getResultList().size()){
                    
                    ArrayList<Integer> z = (ArrayList<Integer>) result[i-3].getResultList().get(m).clone();
                    z.add(i);
                    result[i].getResultList().add(z);
                    m++;
                }
                m=0;
            }
            
        }
        return result;
    }
    //打印路径个数和具体路径
    public static void print(ResultNode[] result){
    
            System.out.println("------reach to "+(result.length-1)+" totally has "+result[result.length-1].getResultList().size()+" roads------");
            
            for(int i =0;i<result[result.length-1].getResultList().size();i++){
                
                for(int j =0;j<result[result.length-1].getResultList().get(i).size();j++)
                    System.out.print(result[result.length-1].getResultList().get(i).get(j)+" ");
                
                System.out.println();
            }
            
    }
    //复制上一步的链表
    public  Object clone() {
        Object o =null;
      try{
        
          o=(ArrayList<Integer>)super.clone();
         
      }catch(CloneNotSupportedException e) {
             
          System.out.println(e.toString());
         
      }
   
      return o;
    }
    
    
}
0 请登录后投票
   发表时间:2010-10-18   最后修改:2010-10-18
哦,可能没看仔细问题,没有求路径了
0 请登录后投票
   发表时间:2010-10-18  
fuliang 写道

正解。
f(n) = f(n-1) + f(n-2) + f(n-3)
f(1) = 1
f(2) = 2
f(3) = 4
ruby代码:
自底向上递推动态规划算法:

def f(n)
f = [1,2,4,7]
return f[n] if n < 4
4.upto(n) do
    f[3] = f[0] + f[1] + f[2]
    f[0], f[1], f[2] = f[1], f[2], f[3]
end
return f[3]
end


你这样只能算出,有多少种走法,但是没有将结果打印出来,朋友
0 请登录后投票
   发表时间:2010-10-18  
kimmking 写道
shkailiao 写道
即该题的重点是怎么更好的将每一种走法记录下来,让调用者通过调用方法可以得到全部走法的详细的情况。

建立历史数据。

还是用递归式。

对于任意的数N,其F(N)为分别用第1部走1加上F(N-1)所有走法序列,加上2,加上3。

这样,可以把序列都写入文件,每次内存中几乎不需要保持数据。
当然,如果序列集不大,可以存入内存。

这些,可以计算理论上,不超过硬盘容量的数据了。


IO会不会太耗时啊?兄台可以把伪代码给出来不,不知是不是没有理解您的思路,谢谢
0 请登录后投票
   发表时间:2010-10-18  
shuofenglxy 写道
消除递归,用循环

你的代码能运行不?你的N的上限是多少呢,运行时间大概是多少?
0 请登录后投票
论坛首页 Java企业应用版

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