《C算法》——遞歸和動態規劃[轉貼]

http://blog.csdn.net/huxin2007/archive/2006/09/28/1302156.aspx 

 

遞歸
-----------------------------------------------------------------------------------------------------
斐波納契數(遞歸實現)不可行

int F(int i)
...
{
    
if(i < 1return 0
;
    
if(i == 1return 1
;
    
return F(i-1+ F(i-2
);
}


-----------------------------------------------------------------------------------------------------
斐波納契數(動態規劃)

int F(int i)
...
{
    
int
 t;
    
if(knownF[i] != unknown) return
 knownF[i];
    
if(i == 0) t = 0
;
    
if(i == 1)  t = 1
;
    
if(i > 1) t = F(i-1+ F(i-2
);
    
return (knownF[i] =
 t);
}

-----------------------------------------------------------------------------------------------------
揹包問題(遞歸實現)不可行

typedef struct 
...
{
    
int
 size;
    
int
 val;
}
 Item;

Item items[N];

int knap(int
 cap)
...
{
    
int
 i, space, max, t;
    
for(i = 0, max = 0; i < N; i++
)
    
...
{
        
if((space = cap - items[i].size) >= 0
)
             
if((t = knap(space) + items[i].val) >
 max)
                 max 
=
 t;
    }

    
return max;
}


-----------------------------------------------------------------------------------------------------
揹包問題(動態規劃)

int knap(int cap)
...
{
    
int
 i, space, max, maxi, t;
    
if(maxKnown[cap] != unknown) return
 maxKnown[cap];
    
for(i = 0, max = 0; i < N; i++
)
    
...
{
        
if((space = cap - items[i].size) >= 0
)
        
...
{
             
if((t = knap(space) + items[i].val) >
 max)
             
...
{
                  max 
=
 t;
                  maxi 
=
 i;
             }
 
        }

    }

    maxKnown[cap] 
= max;
    
return
 max;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章