• <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 個(gè)不同的非零正整數(shù),每個(gè)正整數(shù)最多使用1次,請(qǐng)問(wèn)這n個(gè)正整數(shù)能夠加和的結(jié)果共有多少種(不考慮和超出long的最大值的可以),
            程序中請(qǐng)實(shí)現(xiàn)如下函數(shù)。用于計(jì)算數(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的隨機(jī)數(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? //如果不是最后一個(gè)數(shù)字
            ????? {
            ??????????? for (int i=pos; i<len; i++)
            ??????????? {
            ????????????????? a[num] = data[i];
            ???solve(data, lib, a, len, i+1, max, num+1);?//分析下一個(gè)數(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)先放入表中,所以首先就有一個(gè)*/

            ??? /*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 夢(mèng)想飛揚(yáng) 閱讀(694) 評(píng)論(1)  編輯 收藏 引用

            Feedback

            # re: 編程愛(ài)好者網(wǎng)站的一道老題目  回復(fù)  更多評(pí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 //如果不是最后一個(gè)數(shù)字
            {
            for (int i=pos; i<len; i++)
            {
            a[num] = data[i];
            solve(data, hashtab, a, len, i+1, max, num+1, sumAll, sum); //分析下一個(gè)數(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;
            }

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            三级三级久久三级久久| 99久久国产综合精品五月天喷水| 91亚洲国产成人久久精品网址| 久久久久国产精品熟女影院| 久久人人超碰精品CAOPOREN| 日韩欧美亚洲综合久久影院Ds| 国内高清久久久久久| 久久这里只有精品18| 久久99精品国产99久久6| 久久久久亚洲精品中文字幕| 日本强好片久久久久久AAA| 色综合合久久天天综合绕视看| 一级做a爰片久久毛片看看| 精品久久香蕉国产线看观看亚洲| 欧美精品福利视频一区二区三区久久久精品 | 久久综合综合久久97色| 色综合久久久久综合99| 青青草原综合久久大伊人精品| 国产精品久久久久久久久软件| 伊人久久大香线蕉精品| 欧美午夜精品久久久久免费视| 亚洲一级Av无码毛片久久精品| 久久国产精品-久久精品| 久久天天躁狠狠躁夜夜avapp | 2021最新久久久视精品爱| 99久久国产综合精品网成人影院| 久久综合九色综合网站 | 2022年国产精品久久久久| 久久精品国产亚洲av麻豆图片| 91精品国产高清久久久久久91| 国产成年无码久久久久毛片| 亚洲精品蜜桃久久久久久| 久久无码专区国产精品发布| 一本久久免费视频| 伊人久久大香线蕉成人| 亚洲精品国精品久久99热 | 丁香五月网久久综合| 久久er99热精品一区二区| 久久精品无码专区免费东京热| 无码人妻久久久一区二区三区| 久久婷婷激情综合色综合俺也去|