• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            騰訊2009年重慶筆試附加題

            題目描述:有一個(gè)背包,能盛放的物品總重量為S,設(shè)有N件物品,其重量分別為w1,w2,...,wn.希望從N件物品中選擇若干件物品,所選物品的重量之和恰能放入該背包,即所選物品的重量之和等于S。
                要求:用非遞歸的方法。
              
                便于理解,先說(shuō)說(shuō)遞歸算法。
                非常簡(jiǎn)單: 
             
             int process(int s,int n) 
                

                
            if(s==0)return 1
                
            if(s<0||(s>0&&n<1))return 0
                
            if(process(s-w[n],n-1))   
               

                    cout
            <<w[n]; 
                    
            return 1
                }
             
                
            return process(s,n-1);     
               }
             


            方法1:模擬堆棧

            也很簡(jiǎn)單,先定義一個(gè)struct Node
            typedef struct
                
            int s; 
                
            int n; 
                
            int job;  //1表示要,2表示不要 
                }
            Node; 


            然后將遞歸的方法用數(shù)組模擬出來(lái),其實(shí)就是用數(shù)組實(shí)現(xiàn)進(jìn)棧出棧。
            int Process(int s,int n) 

                STACK stack[
            100],x; 
                
            int top,k,rep;   
                x.s
            =s; 
                x.n
            =n; 
                x.job
            =0
                top
            =1
                stack[top]
            =x; 
                k
            =0
                
            while(k==0&&top>0)
                    x
            =stack[top]; 
                    rep
            =1
                    
            while(!k&&rep)
                        
            if(x.s==0)k=1
                        
            else if(x.s<0||x.n<=0)rep=0
                        
            else 
                            x.s
            =x.s-w[x.n--];      //選取這個(gè)物品 
                            x.job=1
                            stack[
            ++top]=x;        //進(jìn)棧 
                            }
             
                        }
             
                        
            if(!k){                     //總重量超出,需要丟棄其中的某個(gè)物品 
                            rep=1
                            
            while(top>=1&&rep)
                                x
            =stack[top--]; 
                                
            if(x.job==1)
                                    x.s
            +=w[x.n+1];  //丟棄物品 
                                    x.job=2
                                    stack[
            ++top]=x;   //出棧 
                                    rep=0
                                    }
             
                                }
             
                            }
             
                    }
             
                    
            if(k)
                        
            while(top>=1)
                            x
            =stack[top--]; 
                            
            if(x.job==1)cout<<w[x.n+1]; 
                            }
             
                        }
             
                        
            return k; 
                }
             

            這個(gè)程序算法不復(fù)雜,但是由于平時(shí)這種方法用得少,尤其是stack[top--] stack[++top]這種形式的東東容易搞錯(cuò),所以考試的時(shí)候我只寫了算法描述。
                
            方法二: 注意到題目并沒(méi)有限制算法的時(shí)間空間,我們用最暴力來(lái)解決:窮舉法

            #include <iostream> 
            using namespace std; 
            void main() 

            int i,j; 
            int n,s;//n為物品件數(shù),s為背包容量 
            cin>>n; 
            //n = 10; 
            int *= new int[n+1];//存儲(chǔ)物品大小 
            int *= new int[n+1];//物品是否被選中 
            for(i=1;i<=n;i++

              cin
            >>w[i];//輸入物品大小 
              y[i]=0
            }
             
            cin
            >>s; 
            //s = 21; 
            int t=0
            int flag=0
            while(1

              
            for(i=1;i<=n;i++)//把物品選中的整個(gè)串當(dāng)作一個(gè)二進(jìn)數(shù),進(jìn)行范圍的全搜索 
              
               
            if(y[i]==0
               

                y[i]
            =1
                
            //cout<<"step in y[i]=0"; 
                break
               }
             
               
            else 
               

                
            if (i==n) 
                

                 flag 
            = 1
                }
             
                y[i]
            =0
                
            continue
               }
             
              }
             
              t 
            = 0
              
            for(j=1;j<=n;j++
              

               t 
            = t+w[j]*y[j]; 
              }
             
              
            if(t == s)//判斷是否求得解,求到解就直接退出 
              
               
            for(i=1;i<=n;i++
               

                
            if(y[i]==1) cout<<w[i]<<"  "
               }
             
               
            break
              }
             
              
            if(flag == 1//無(wú)解處理 
              
               cout
            <<"no answer"<<endl; 
               
            break
              }
             
            }
             
            }

            posted on 2008-10-23 19:28 流牛ζ木馬 閱讀(2139) 評(píng)論(3)  編輯 收藏 引用

            評(píng)論

            # re: 騰訊2009年重慶筆試附加題 2008-12-05 13:58 goldallen

            非常不錯(cuò)的 :)  回復(fù)  更多評(píng)論   

            # re: 騰訊2009年重慶筆試附加題 2008-12-05 18:43 goldallen

            用數(shù)組實(shí)現(xiàn)遞歸 感覺(jué)有些難度...
              回復(fù)  更多評(píng)論   

            # re: 騰訊2009年重慶筆試附加題[未登錄](méi) 2009-06-01 00:13 lyx

            第一個(gè)遞歸算法必須要保證剛剛好能裝滿背包,否則就會(huì)死循環(huán)了。  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木馬

            常用鏈接

            留言簿(6)

            隨筆檔案

            相冊(cè)

            搜索

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日本久久久精品中文字幕| 婷婷综合久久中文字幕蜜桃三电影| 午夜欧美精品久久久久久久| 色综合久久综合中文综合网| 久久99热只有频精品8| 久久国产成人午夜aⅴ影院 | 一本色综合网久久| 中文字幕无码久久精品青草 | 中文字幕久久久久人妻| 久久99亚洲网美利坚合众国| 精品久久久久久无码免费| 一本综合久久国产二区| 久久免费美女视频| 久久婷婷五月综合国产尤物app | 色妞色综合久久夜夜| 久久久久久久久久久久中文字幕| 久久婷婷久久一区二区三区| 婷婷久久五月天| 国产无套内射久久久国产| 精品伊人久久久| 精品无码久久久久久久动漫| 狠狠综合久久AV一区二区三区| 国产精品成人99久久久久| 久久99精品久久只有精品 | 伊人色综合久久| 国产亚洲欧美成人久久片| 99精品国产综合久久久久五月天| 久久久久亚洲av成人无码电影| 久久九九精品99国产精品| 久久亚洲sm情趣捆绑调教| 久久无码人妻精品一区二区三区| 亚洲国产精品久久66| 国产精品久久午夜夜伦鲁鲁| 日日躁夜夜躁狠狠久久AV| 中文字幕乱码人妻无码久久| 久久久久久久97| 久久精品国产99国产精品导航| 亚洲人成无码网站久久99热国产| 久久涩综合| 国产精品久久久久久久app| 精品久久久久久无码不卡|