• <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。中間加了幾句調試,答案是最后一行;
            大牛們幫幫忙!!!
              回復  更多評論
              
            久久久久久av无码免费看大片| 亚洲精品无码久久一线| 精品熟女少妇aⅴ免费久久| 99久久99久久精品国产片果冻| 日本久久久久久久久久| 性高湖久久久久久久久| 夜夜亚洲天天久久| 精品久久久中文字幕人妻| 久久青草国产精品一区| 久久亚洲精品无码aⅴ大香| 国产产无码乱码精品久久鸭| 久久精品中文字幕有码| 97热久久免费频精品99| 久久婷婷人人澡人人爽人人爱| 成人精品一区二区久久| 亚洲成色www久久网站夜月| 久久噜噜久久久精品66| 狠狠色婷婷综合天天久久丁香| 狠狠色噜噜色狠狠狠综合久久 | 99久久久精品免费观看国产| 久久国产综合精品五月天| 97久久久久人妻精品专区| 漂亮人妻被中出中文字幕久久| 青青青国产成人久久111网站| 国产亚洲美女精品久久久2020| 久久www免费人成看国产片| 91精品国产91久久综合| 亚洲中文字幕久久精品无码喷水| 久久久久99精品成人片三人毛片| 2021少妇久久久久久久久久| 久久久久亚洲AV无码永不| 久久久国产精华液| 国产A级毛片久久久精品毛片| 久久久久国色AV免费看图片| 久久久久亚洲av成人无码电影| 亚洲午夜久久久精品影院| 99久久99这里只有免费的精品| 国产精品久久久久AV福利动漫 | 久久综合久久性久99毛片| 精品国产婷婷久久久| 久久精品国产只有精品66 |