• <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 個不同的非零正整數,每個正整數最多使用1次,請問這n個正整數能夠加和的結果共有多少種(不考慮和超出long的最大值的可以),
            程序中請實現如下函數。用于計算數組data,中ncount的加和的數量。
            long getsumcount(long data[], long count);
            程序中可以出現別的輔助函數?;蜉o助結構等。

            例如,
            data[] = {1,2,3,4};
            ncount = 4;
            函數返回 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
            如上。所以結果是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++) //給數組賦值為1-100的隨機數
            ????? {
            ??????????? 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? //如果不是最后一個數字
            ????? {
            ??????????? for (int i=pos; i<len; i++)
            ??????????? {
            ????????????????? a[num] = data[i];
            ???solve(data, lib, a, len, i+1, max, num+1);?//分析下一個數
            ??????????? }
            ????? }
            }

            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已經先放入表中,所以首先就有一個*/

            ??? /*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 夢想飛揚 閱讀(690) 評論(1)  編輯 收藏 引用

            Feedback

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

            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 //如果不是最后一個數字
            {
            for (int i=pos; i<len; i++)
            {
            a[num] = data[i];
            solve(data, hashtab, a, len, i+1, max, num+1, sumAll, sum); //分析下一個數
            }
            }
            }

            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| 无码精品久久久天天影视 | 久久精品无码一区二区三区日韩| 国产精品永久久久久久久久久| 久久天天躁夜夜躁狠狠躁2022| 蜜桃麻豆www久久| 伊人久久综合精品无码AV专区| 国产无套内射久久久国产| 亚洲欧洲久久久精品| 久久精品这里热有精品| 深夜久久AAAAA级毛片免费看| 国产高潮国产高潮久久久91| 久久久久久曰本AV免费免费| 久久九九青青国产精品| 久久久高清免费视频| 一级A毛片免费观看久久精品| 国内精品久久久久伊人av | 色综合色天天久久婷婷基地| 18岁日韩内射颜射午夜久久成人| 国产精品久久久久久久人人看| 久久亚洲综合色一区二区三区| 2020久久精品亚洲热综合一本| 婷婷久久综合九色综合98| 久久综合九色综合网站| 久久99精品国产麻豆宅宅| 久久久久国产精品三级网| 91久久精品国产91性色也| 久久久无码一区二区三区| 久久久青草久久久青草| 色狠狠久久AV五月综合| 久久无码专区国产精品发布| 久久免费香蕉视频| 久久夜色精品国产亚洲av| 久久se精品一区精品二区| 麻豆久久| 亚洲日本久久久午夜精品| 欧美日韩精品久久久免费观看| 久久久久99精品成人片三人毛片| 91麻豆精品国产91久久久久久|