• <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>
            付翔的專欄
            在鄙視中成長 記錄成長的點滴
            posts - 106,  comments - 32,  trackbacks - 0

            大概的題意是: 給定一個序列 1 。。N ,假設全集為U那么存在多少種情況 : 兩個子集A B其中A∩B=∅ ,A∪B=U ,A元素的和== B元素的和。

            開始寫了個遞歸,枚舉,提交超時:void work(int deep,int start)

            {
                if(deep >= n)    return;
                if(ans > (sum -ans)) return ;
                if(ans == sum-ans)
                {
                    gcount ++;
                    /*FOR_1(i,1,n){
                        if(used[i] == 1)
                        fout<<i<< " ";
             
                    }
                    fout<<endl;
            */
                    return ;
                }
             
                FOR_1(i,start + 1,n){
                    if(used[i] == 0){
                        used[i] = 1;
                        ans += i;
                        work(deep + 1,i);
                        used[i] = 0;
                        ans -= i;
                    }
                }
             
            }

            之后改用另外一種思路,f(n,ans) = f(n-1,ans-n) + f(n-1,ans) ,這個有點分治的思路,把問題的規(guī)模逐漸縮小,從而得到解。中間加了個優(yōu)化,用一個二維數(shù)組存下中間計算的結果,這樣就不會超時。

            /*
            ID:fuxiang2
            PROG: subset
            LANG: C++
            */
            #include <iostream>
            #include <fstream>
            #include <stack>
            #include <string>
            #include <vector>
            #include <queue>
            #include <map>
            #include <list>
            #include <algorithm>
            #include <set>
            #include <cmath>
            #include <cstring>
            #include <cstdlib>
             
            #define REP(i, n) for (int i=0;i<int(n);++i)
            #define FOR(i, a, b) for (int i=int(a);i<int(b);++i)
            #define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)
            #define REP_1(i, n) for (int i=1;i<=int(n);++i)
            #define FOR_1(i, a, b) for (int i=int(a);i<=int(b);++i)
            #define DWN_1(i, b, a) for (int i=int(b);i>=int(a);--i)
            #define EACH(it, A) for (typeof(A.begin()) it=A.begin(); it != A.end(); ++it)
             
            using namespace std;
            ofstream fout ("subset.out");
            ifstream fin ("subset.in");
             
            const int N = 40;
            int used[N];
            int n ;
            int sum;
            int ans ;
            int gcount ;
            int data[40][800];
            void work(int deep,int start)
            {
                if(deep >= n)    return;
                if(ans > (sum -ans)) return ;
                if(ans == sum-ans)
                {
                    gcount ++;
                    /*FOR_1(i,1,n){
                        if(used[i] == 1)
                        fout<<i<< " ";
             
                    }
                    fout<<endl;
            */
                    return ;
                }
             
                FOR_1(i,start + 1,n){
                    if(used[i] == 0){
                        used[i] = 1;
                        ans += i;
                        work(deep + 1,i);
                        used[i] = 0;
                        ans -= i;
                    }
                }
             
            }
             
            int solve(int n ,int ans)
            {
                int msum = (n+1)*n/2;
                if(ans <= 0) return 0;
                if(msum < ans) return 0 ;
                else if(msum == ans ) return 1 ;
             
                if(data[n][ans] )
                    return data[n][ans] ;
             
                data[n-1][ans-n] = solve(n-1,ans-n);
                data[n-1][ans] = solve(n-1,ans);
             
                return data[n-1][ans-n] + data[n-1][ans];
            }
            int main()
            {
                fin>>n;
                sum = (1+n)*n/2;
                ans = 0;
                if(sum%2 ==1){
                    fout<<"0"<<endl;
                }
                else {
                    //work(0,0);
                    
            //fout<<gcount/2 <<endl;
                    int re = solve(n,sum/2);
                    fout<<re<<endl;
                }
             
                //int re = solve(n,sum/2);
                
            //fout<<re<<endl;
                return 0;
             
            }
            原始博客地址:http://www.fuxiang90.com/2012/07/usaco2-2-subset-sums/
            posted on 2012-07-26 23:16 付翔 閱讀(271) 評論(0)  編輯 收藏 引用 所屬分類: ACM 數(shù)據(jù)結構

            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            CSDN - 我的blog地址

            博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久人妻少妇嫩草AV蜜桃| 亚洲国产精品久久电影欧美| www.久久热| 伊人久久大香线蕉亚洲| 97精品依人久久久大香线蕉97 | a级成人毛片久久| 思思久久99热免费精品6| 欧美日韩精品久久久免费观看| 久久久久久久波多野结衣高潮 | 久久精品国产亚洲av麻豆小说| 精品国产日韩久久亚洲| 久久综合亚洲鲁鲁五月天| 久久久久久久综合狠狠综合| 久久久久久国产a免费观看黄色大片 | 色婷婷久久久SWAG精品| 精品久久人人妻人人做精品| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久狠狠色狠狠色综合| 99精品久久精品| 青青青国产成人久久111网站| 亚洲国产精品一区二区久久| 性高朝久久久久久久久久| 亚洲人成伊人成综合网久久久| 亚洲国产精品久久久天堂| 久久婷婷人人澡人人爽人人爱| 亚洲欧美久久久久9999| 嫩草伊人久久精品少妇AV| 久久精品水蜜桃av综合天堂| 精品国产福利久久久| 少妇人妻88久久中文字幕| 欧美牲交A欧牲交aⅴ久久| 久久精品国产影库免费看 | 国产精品青草久久久久婷婷| 久久精品免费大片国产大片| 久久久久亚洲爆乳少妇无| 伊人久久大香线蕉AV色婷婷色| 久久这里只有精品18| 一级a性色生活片久久无| 精品国产乱码久久久久久1区2区| 亚洲天堂久久精品| 97久久精品无码一区二区天美|