• <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>

            二、任給 1<=n<=20 個不同的非零正整數(shù),每個正整數(shù)最多使用1次,請問這n個正整數(shù)能夠加和的結(jié)果共有多少種(不考慮和超出long的最大值的可以),
            程序中請實現(xiàn)如下函數(shù)。用于計算數(shù)組data,中ncount的加和的數(shù)量。
            long getsumcount(long data[], long count);
            程序中可以出現(xiàn)別的輔助函數(shù)。或輔助結(jié)構(gòu)等。

            例如,
            data[] = {1,2,3,4};
            ncount = 4;
            函數(shù)返回 10

            分解如下。(0不算)

            1??= 1
            2??= 2
            3??= 3 = 1+2
            4??= 4 = 1+3

            5??= 2+3 = 1+4
            6??= 2+4 = 1+2+3
            7??= 3+4 = 1+2+4
            8??= 1+3+4
            9??= 2+3+4
            10 = 1+2+3+4
            如上。所以結(jié)果是10種可能。
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            #include <iostream>
            #include <time.h>
            #define libsize (1<<16)
            #define hashsize (1<<16)
            #define hashmask (0xffff)

            using namespace std;

            typedef struct node{
            ??? long data;
            ??? struct node *next;
            }NODE;
            NODE hashtab[hashsize];

            const long MAX = 20;

            bool IsNew(long array[], long len, long data);
            void solve(const long data[], bool lib[], long a[], long len, long pos, long max, long num);
            long _getsumcount(const long data[], long count);
            long Sum(const long a[], int len);
            long getsumcount(const long data[], long count);

            int main(void)
            {
            ????? time_t startTime;
            ?time_t endTime;
            ?time(&startTime);
            ????? long data[MAX]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

            ????? for (long i=0; i<MAX; i++) //給數(shù)組賦值為1-100的隨機數(shù)
            ????? {
            ??????????? long temp = rand()%100 + 1;
            ??????????? if (IsNew(data, i, temp))
            ????????????????? data[i] = temp;
            ????? }

            ????? for (long i=0; i<MAX; i++)
            ??????????? cout << data[i] << ' ';
            ????? cout << endl;

            ????? int sum = 0;
            ????? for (long i=1; i<=MAX; i++)
            ????? {
            ??????????? long s1 = getsumcount(data, i);
            ??????????? long s2 = _getsumcount(data, i);
            ???????????
            ??????????? cout << i << ": s1=" << s1 <<"? s2=" << s2 << endl;
            ??????????? if (s1 == s2)
            ????????????????? sum++;
            ????? }
            ????? cout << sum << endl;

            ????? time(&endTime);
            ?cout << "time:" << difftime(endTime, startTime) << endl;

            ?getchar();
            ?return 0;
            }
            //////////////////////////////////////////////////////////////////////////
            /*
            ? Author: goal00001111
            */
            bool IsNew(long array[], long len, long data)
            {
            ????? for(int i=0; i<=len; i++)
            ??????????? if (array[i] == data)
            ????????????????? return false;
            ????? return true;
            }

            long _getsumcount(const long data[], long count)
            {
            ????? bool lib[libsize];
            ????? for (long i=0; i<libsize; i++)
            ??????????? lib[i] = false;
            ????? long *a = new long[count];

            ????? for (int k=0; k<count; k++)
            ??????????? solve(data, lib, a, count, 0, k, 0);

            ????? delete []a;
            ????? long sum = 1;
            ????? for (long i=0; i<libsize; i++)
            ????? {
            ??????????? if (lib[i])
            ??????????? {
            ????????????????? sum++;
            ??????????????? // cout << i << ' ';
            ??????????? }
            ????? }
            ????? return sum;
            }

            void solve(const long data[], bool lib[], long a[], long len, long pos, long max, long num)
            {
            ????? if (num == max)
            ????? {
            ??????????? for (int i=pos; i<len; i++)
            ??????????? {
            ????????????????? a[num] = data[i];
            ????????????????? lib[Sum(a, num)] = true;
            ??????????? }
            ????? }
            ????? else? //如果不是最后一個數(shù)字
            ????? {
            ??????????? for (int i=pos; i<len; i++)
            ??????????? {
            ????????????????? a[num] = data[i];
            ???solve(data, lib, a, len, i+1, max, num+1);?//分析下一個數(shù)
            ??????????? }
            ????? }
            }

            long Sum(const long a[], int len)
            {
            ????? long sum = 0;
            ????? for (int i=0; i<=len; i++)
            ??????????? sum += a[i];
            ????? return sum;
            }
            ///////////////////////////////////////////////////////////////////////
            /*
            ? Author: eastcowboy
            */

            /*尋找并插入,找到而未插入返回0,未找到而插入返回1*/
            static int hashinsert(long sum)
            {
            ??? NODE *p,*q;
            ??? p = hashtab+ (sum & hashmask);
            ??? while( p && (p->data!=sum) )
            ??? {?? q = p;
            ??????? p = p->next;
            ??? }
            ??? if( p )
            ??????? return 0;
            ??? q->next = p = (NODE*)malloc(sizeof(NODE));
            ??? p ->next = NULL;
            ??? p ->data = sum;
            ??? return 1;
            }
            /*刪除hash表的第index條目*/
            static void hashdelete(long index)
            {?? NODE *p,*q;
            ??? p = hashtab[index].next;
            ??? while(p)
            ??? {?? q = p;
            ??????? p = p->next;
            ??????? free(q);
            ??? }
            }
            /*這才是正主^^*/
            long getsumcount(const long data[],long count)
            {
            ??? long i;
            ??? int state[MAX] = {0};
            ??? long sum = 0,sp = 0;
            ??? int ret = 1; /*由于0已經(jīng)先放入表中,所以首先就有一個*/

            ??? /*hash表初始化*/
            ??? for(i=0;i<hashsize;++i)
            ??? {?? hashtab[i].data = 0;
            ??????? hashtab[i].next = NULL;
            ??? }
            ??? /*回溯求解*/
            ??? while(sp>=0)
            ??? {?? if(sp==count)
            ??????? {?? ret += hashinsert(sum);
            ??????????? --sp;
            ??????? }
            ??????? switch( state[sp] )
            ??????? {?? case 0:
            ??????????????? state[sp] = 1;
            ??????????????? sum += data[sp];
            ??????????????? ++sp;
            ??????????????? break;
            ??????????? case 1:
            ??????????????? state[sp] = 2;
            ??????????????? sum -= data[sp];
            ??????????????? ++sp;
            ??????????????? break;
            ??????????? case 2:
            ??????????????? state[sp] = 0;
            ??????????????? --sp;
            ??????????????? break;
            ??????? }
            ??? }
            ??? /*hash表銷毀*/
            ??? for(i=0;i<hashsize;++i)
            ??? {?? hashdelete(i);
            ??? }
            ??? return ret;
            }

            Posted on 2006-06-01 23:33 夢想飛揚 閱讀(698) 評論(1)  編輯 收藏 引用

            Feedback

            # re: 編程愛好者網(wǎng)站的一道老題目  回復  更多評論   

            2006-06-02 21:20 by goal00001111
            再增加一種:
            typedef struct node{
            long key;
            int si;
            }NODE;
            NODE *hashtab;
            long getsumcount(const long data[], long count)
            {
            long sumAll = (1<<count); // cout << "toatl: " << sumAll << endl;

            hashtab = new NODE[sumAll];
            for (long i=0; i<sumAll; i++)
            {
            hashtab[i].key = 0;
            hashtab[i].si = 0;
            }

            long *a = new long[count];
            long sum = 0;
            for (int k=0; k<count; k++)
            solve(data, hashtab, a, count, 0, k, 0, sumAll, sum);

            //double ave = 0;
            // for (long i=0; i<sumAll; i++)
            // ave += hashtab[i].si;
            // cout << "ave= " << ave/sum << endl;

            delete []a;
            delete []hashtab;

            return sum;
            }

            void solve(const long data[], NODE hashtab[], long a[], long len, long pos, long max, long num, long sumAll, long & sum)
            {
            if (num == max)
            {
            for (int i=pos; i<len; i++)
            {
            a[num] = data[i];
            sum += HashInsert(hashtab, sumAll, Sum(a, num));
            }
            }
            else //如果不是最后一個數(shù)字
            {
            for (int i=pos; i<len; i++)
            {
            a[num] = data[i];
            solve(data, hashtab, a, len, i+1, max, num+1, sumAll, sum); //分析下一個數(shù)
            }
            }
            }

            long HashInsert(NODE hashtab[], long max, long data)
            {
            long d = data % max;
            if (hashtab[d].key == 0)
            {
            hashtab[d].key = data;
            hashtab[d].si = 1;
            }
            else
            {
            int sum = 1;
            while (hashtab[d].key != data && hashtab[d].key != 0)
            {
            d = (d + 1) % max;
            sum++;
            }

            if (hashtab[d].key == data)
            return 0;

            hashtab[d].key = data;
            hashtab[d].si = sum;
            }
            return 1;
            }

            long Sum(const long a[], int len)
            {
            long sum = 0;
            for (int i=0; i<=len; i++)
            sum += a[i];
            return sum;
            }
            91久久香蕉国产熟女线看| 久久丫精品国产亚洲av不卡| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 无码国产69精品久久久久网站| 久久久久99精品成人片欧美 | 青青国产成人久久91网| 久久久久国产一区二区三区| 国产偷久久久精品专区 | 精品综合久久久久久888蜜芽| 久久免费线看线看| 亚洲日韩欧美一区久久久久我| 国产精品禁18久久久夂久 | 久久精品国产亚洲5555| 中文字幕日本人妻久久久免费| 精品水蜜桃久久久久久久| 亚洲国产精品无码久久一线| 国产精品狼人久久久久影院| 一本一本久久aa综合精品| 久久久久国产亚洲AV麻豆| 久久99国产精品99久久| 人妻精品久久久久中文字幕69| 午夜精品久久久内射近拍高清 | 综合久久一区二区三区| 国产精品免费久久久久电影网| 久久久精品人妻一区二区三区四| 香蕉久久永久视频| 亚洲欧洲久久av| 亚洲国产一成久久精品国产成人综合| 91精品免费久久久久久久久| 久久国产精品久久| 91久久精一区二区三区大全| 久久精品蜜芽亚洲国产AV| 日日噜噜夜夜狠狠久久丁香五月 | 久久91亚洲人成电影网站| 精品免费久久久久久久| 精品久久久久久久久午夜福利| 日产精品99久久久久久| 国内精品久久久久伊人av| 国内精品久久久久久野外| 日本道色综合久久影院| 久久久久久青草大香综合精品|