• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0

            NOIp2006年的第二題,典型的動態規劃,物品之間有依賴關系。可以把物品分為若干組,每組最多有四種衍生出來的“物品”,即只選擇一個主件,選擇一個主件和一個附件(兩種),選擇一個主件和兩個附件。由題意得,每組只能選擇一個“物品”,這樣就把題目轉化成了分組背包問題。

            我的做法是DFS一次(雖說是DFS,實際結點數只是4),計算出衍生出來的若干組“物品”,然后用分組背包的做法進行動態規劃。

            此題目還有一個優化:因為所給數據是10的倍數,所以可以在開始時除以10,最后輸出時再乘上10,用來減少狀態數量。

             

            以下是我的代碼:

            #include<stdio.h>
            #define SIZE 61
            #define max(a,b) (a>b?a:b)
            long N,m,v[SIZE],p[SIZE],q[SIZE];
            long maino=0,c[SIZE][SIZE]={0},w[SIZE][SIZE]={0},d[3201]={0};
            int find(int nn,int kk)
            {
                
            long i;
                
            for(i=kk;i<=m;i++)
                  
            if(q[i]==nn)
                     
            return i;
                
            return 0;
            }

            void dfs(long now,long ii,long weight,long cost)
            {// 第now個主件 
                long t;
                t
            =find(now,ii+1);
                
            if(!t)
                
            {
                   c[maino][
            0]++;
                   w[maino][
            0]++;
                   c[maino][ c[maino][
            0] ]=cost;
                   w[maino][ w[maino][
            0] ]=weight;
                   
            return;
                }

                dfs(now,t,weight,cost);
                dfs(now,t,weight
            +v[t]*p[t],cost+v[t]);
            }

            void init()
            {
                
            long i,j;
                FILE 
            *fin=fopen("budget.in","r");
                fscanf(fin,
            "%ld%ld",&N,&m);
                N
            /=10;
                
            for(i=1;i<=m;i++)
                  q[i]
            =0;// Clear
                for(i=1;i<=m;i++)
                
            {
                   fscanf(fin,
            "%ld%ld%ld",&v[i],&p[i],&q[i]);
                   v[i]
            /=10;
                }

                fclose(fin);
                
            // Read In
                for(i=1;i<=m;i++)
                
            {
                   c[i][
            0]=0;
                   w[i][
            0]=0;
                }

                
            for(i=1;i<=m;i++)
                  
            if(q[i]==0)
                  
            {
                     maino
            ++;
                     dfs(i,
            0,v[i]*p[i],v[i]);
                  }

            }

            void dp()
            {
                
            long k,i,j;
                
            for(k=1;k<=maino;k++)
                  
            for(j=N;j>=0;j--)
                    
            for(i=1;i<=c[k][0];i++)
                      
            if(j>=c[k][i])
                        d[j]
            =max(d[j],d[j-c[k][i]]+w[k][i]);
            }

            void write()
            {
                FILE 
            *fout=fopen("budget.out","w");
                
            long i,ans=0;
                  
            for(i=0;i<=N;i++)
                    ans
            =max(ans,d[i]);
                fprintf(fout,
            "%ld\n",ans*10);
                fclose(fout);
            }

            int main()
            {
                init();
                dp();
                write();
            return 0;
            }

            posted on 2010-01-06 19:48 lee1r 閱讀(690) 評論(1)  編輯 收藏 引用 所屬分類: 題目分類:動態規劃

            FeedBack:
            # re: vijos P1313 金明的預算方案 求助
            2010-10-06 17:51 | dingdinglhz@gmail.com
            //大牛幫幫忙!!!

            #include<iostream>
            using namespace std;
            int c[61],w[61];//原始c、w
            int kids[61][2],father[61];//主附件關系
            int lc[61][4],lw[61][4];//分組后c、w
            int f[3201];
            int n,m,fa=0;
            void init(){
            int k[61];
            cin>>n>>m;
            for(int i=1;i<=m;i++){cin>>c[i]>>w[i]>>k[i];c[i]/=10;w[i]*=c[i];}
            for(int i=1;i<=m;i++){if(!k[i]){fa++;father[fa]=i;}}
            for(int i=1;i<=m;i++){
            if(k[i]){
            if(kids[k[i]][0]){kids[k[i]][1]=i;}
            else{kids[k[i]][0]=i;}
            }
            }
            for(int i=1;i<=fa;i++){
            cout<<kids[i][0]<<" "<<kids[i][1]<<" "<<father[i]<<endl;
            }
            }
            void make_club(){
            for(int i=1;i<=fa;i++){
            lc[i][0]=c[father[i]];lw[i][0]=w[father[i]];
            lc[i][1]=lc[i][0]+c[kids[i][0]];lw[i][1]=lw[i][0]+w[kids[i][0]];
            lc[i][2]=lc[i][0]+c[kids[i][1]];lw[i][2]=lw[i][0]+w[kids[i][1]];
            lc[i][3]=lc[i][1]+lc[i][2]-lc[i][0];lw[i][3]=lw[i][1]+lw[i][2]-lw[i][0];
            }
            for(int i=1;i<=fa;i++){
            for(int j=0;j<=3;j++){
            cout<<lc[i][j]<<" "<<lw[i][j]<<endl;
            }
            cout<<endl;
            }
            }
            void dp(){
            for(int k=1;k<=fa;k++){
            for(int v=(n/10);v>=0;v--){
            //for(int v=0;v<=(n/10);v++){
            for(int i=0;i<=3;i++){
            if(v-lc[k][i]>=0){f[v]=max(f[v],f[v-lc[k][i]]+lw[k][i]);}
            }
            }
            for(int v=0;v<=n/10;v++){cout<<f[v]<<" ";}
            cout<<endl;
            }
            cout<<f[n/10]*10;
            }
            int main(){
            //freopen("budget.in" ,"r",stdin );
            //freopen("budget.out","w",stdout);
            init();
            make_club();
            dp();
            system("pause");
            return 0;
            }
            /*
            自測60分
            2000 10
            500 1 0
            400 4 0
            300 5 1
            400 5 1
            200 5 0
            500 4 5
            400 4 0
            320 2 0
            410 3 0
            400 3 5
            正確答案為7340,我的答案為7200。中間加了幾句調試,答案是最后一行;
            大牛們幫幫忙!!!
              回復  更多評論
              
            91亚洲国产成人久久精品| 久久人人爽人人爽人人AV东京热| 国产精品久久久天天影视| 伊人久久综合热线大杳蕉下载| 伊人久久大香线蕉影院95| 久久夜色精品国产噜噜亚洲a| 久久人人爽人人爽人人AV| 91精品婷婷国产综合久久| 久久婷婷五月综合97色直播| 97久久精品午夜一区二区| 久久免费99精品国产自在现线| 国产69精品久久久久APP下载| 国内精品久久人妻互换| 亚洲国产成人久久综合区| 国产一级做a爰片久久毛片| 一本一本久久A久久综合精品| 99精品伊人久久久大香线蕉| 久久夜色精品国产网站| 久久综合亚洲鲁鲁五月天| 国产精品日韩欧美久久综合| 久久中文骚妇内射| 久久婷婷成人综合色综合| 一本一道久久综合狠狠老| 久久久一本精品99久久精品88| 久久一区二区免费播放| 国产女人aaa级久久久级| 91精品国产91久久综合| 日韩精品久久久肉伦网站| 国产亚洲精品美女久久久| 久久久国产精华液| 久久精品国产影库免费看| 久久久久久夜精品精品免费啦| 2021最新久久久视精品爱| 久久久黄色大片| 久久久久se色偷偷亚洲精品av| 亚洲美日韩Av中文字幕无码久久久妻妇| 99久久婷婷国产一区二区 | 中文字幕成人精品久久不卡| 久久99精品久久久久久hb无码| 欧美黑人激情性久久| 久久精品无码专区免费青青|