• <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>
            Welcome to Leon's Blog  
            日歷
            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789
            統(tǒng)計(jì)
            • 隨筆 - 30
            • 文章 - 0
            • 評(píng)論 - 51
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            ACM

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             
                   今天早上終于提交成功了!這道題做了有一個(gè)星期多了,老是找不到原因。今天在偶然間發(fā)現(xiàn)了,先將代碼貼出來,還請大家指正!感謝steven和一個(gè)匿名網(wǎng)友的建議,謝謝你們!但是程序運(yùn)行的時(shí)間還是過長,希望大家能夠幫助修改。

              1#include <stdio.h>
              2#include <string.h>
              3#include <stdlib.h>
              4
              5
              6int result[4];
              7int reNumber, reCount, tie, reMax;        //result是最終客戶的郵票種類,reCount是客戶郵票總個(gè)數(shù),reNumber是客戶不同郵票的個(gè)數(shù)
              8                                                    
              9int GetNumber(int *stamp, int *customer, int *stampNumber, int *customerNumber)        //獲取郵票 和 客戶信息。
             10{
             11    int i, n,count[100];    // count在這里起到一個(gè)優(yōu)化的作用。
             12    n = 0;
             13    (*stampNumber) = 0;
             14    memset(count, 0 ,sizeof(int)*100);
             15    while(1)        //收集關(guān)于郵票的面值。
             16    {
             17        if(scanf("%d"&n) == EOF)
             18            return -1;
             19        if(n == 0)
             20            break;
             21        if(count[n]++ < 5)
             22            stamp[(*stampNumber)++= n;
             23    }

             24    //stampNumber--;
             25    (*customerNumber) = 0;
             26    while(1)
             27    {
             28        scanf("%d"&n);        //收集關(guān)于客戶需要郵票的總面值數(shù)。
             29        if(n == 0)
             30            break;
             31        customer[(*customerNumber)++= n;
             32    }

             33    return 1;
             34}

             35int NotSame(int *number,const int count, int *m,int *stamp)        //求不同一組郵票類別的個(gè)數(shù)和郵票的最大面值。
             36{
             37    int i,j, c,s;
             38    c = 0;
             39    *= stamp[number[0]];
             40    for(i = 0; i < count; i++)
             41    {
             42        if*< stamp[number[i]])        //求最大面值的郵票
             43            *= stamp[number[i]];
             44        s = 0;
             45        for(j = 0; j < i; j++)        //求不同面值郵票的個(gè)數(shù)
             46        {
             47            if(number[i] == number [j])
             48            {
             49                s = 1;
             50                break;
             51            }

             52        }

             53        if(0 == s)
             54            c++;
             55    }

             56    return c;
             57}

             58
             59
             60void Divide(int sum, int *number, int *stamp,int n, int *count, int same,int start)
             61{
             62    int i;
             63    int t;
             64    if*count > 4 ) 
             65            return;
             66    else if( sum == 0 && *count <= 4)        //郵票個(gè)數(shù)《=4的時(shí)候且保存在數(shù)組number中的郵票面值=sum的時(shí)候。    
             67    {
             68        same = NotSame(number, *count,&t, stamp);
             69        if( same > reNumber || same == reNumber && reCount > *count || same == reNumber && reCount == *count && reMax < t )//根據(jù)不同的條件來判斷。
             70        {
             71            reMax = t;
             72            reCount = *count;
             73            reNumber = same;
             74            for(i = 0; i < *count; i++)
             75                result[i] = number[i];
             76            tie = 0;
             77        }

             78        else if(same == reNumber && reCount == *count && reMax == t)//當(dāng)郵票面值的最大值、郵票種類數(shù),郵票個(gè)數(shù)相等時(shí)。
             79        {
             80            tie = 1;
             81        }

             82
             83        return;
             84    }

             85    for(i = start; i < n; i++)        //遞歸搜索
             86    {
             87        sum -= stamp[i];
             88        if(sum >= 0)
             89        {
             90            number[(*count)++= i;
             91            Divide(sum, number, stamp, n, count,same,i);
             92            (*count)--;
             93        }

             94        sum += stamp[i];
             95    }
                
             96}

             97
             98
             99int main(int argc, char* argv[])
            100{
            101    int stamp[100], customer[100];        //stamp保存郵票的面值,customer保存客戶需要郵票的總面值。
            102    int number[5];        //臨時(shí)數(shù)據(jù),記錄滿足條件的臨時(shí)結(jié)果。此前提交一直WA的原因是number分配的空間太小了!
            103    int count,stampNumber = -1, customerNumber = -1;//stampNumber是郵票的個(gè)數(shù),customerNumber是客戶個(gè)數(shù) 
            104    int i,j;
            105
            106    do
            107    {    
            108        memset(stamp, 0100*sizeof(int));
            109        memset(customer, 0100*sizeof(int));
            110        memset(number, 0 ,4);
            111        if(GetNumber(stamp, customer, &stampNumber, &customerNumber) == -1)
            112            break;
            113        for(i = 0; i < customerNumber; i++)
            114        {
            115            reMax = -1;        //對數(shù)據(jù)初始化。
            116            memset(result, 04);
            117            reNumber = -1;
            118            count=0;
            119            tie = 0;
            120            Divide(customer[i], number,stamp, stampNumber/*+1*/,&count, -1,0);
            121            if(reNumber != -1)        //打印。
            122            {
            123                if(tie == 0)        //找到滿足條件的結(jié)果。
            124                {
            125                    printf("%d (%d):", customer[i], reNumber);
            126                    for(j = 0; j <  reCount; j++)
            127                            printf(" %d",stamp[result[j]]);
            128                    printf("\n");
            129                }

            130                else if( tie == 1)    //存在郵票面值的最大值、郵票種類數(shù),郵票個(gè)數(shù)相同的答案
            131                {
            132                    printf("%d (%d): tie\n",customer[i], reNumber);
            133                }

            134            }

            135            else        //不滿足條件
            136            {
            137                printf("%d ---- none\n",customer[i]);
            138            }

            139        }

            140    }
            while(1);
            141    return 0;
            142}

            posted on 2008-07-01 09:56 Leon916 閱讀(1933) 評(píng)論(4)  編輯 收藏 引用
            評(píng)論:

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


             
            Copyright © Leon916 Powered by: 博客園 模板提供:滬江博客
            思思久久99热免费精品6| 人人妻久久人人澡人人爽人人精品| 狠狠精品久久久无码中文字幕| 亚洲第一极品精品无码久久| 亚洲精品蜜桃久久久久久| 日韩人妻无码精品久久久不卡| 午夜不卡888久久| 欧美亚洲国产精品久久| 日韩人妻无码精品久久免费一 | 777米奇久久最新地址| 精品国产福利久久久| 久久久久国产精品嫩草影院| 77777亚洲午夜久久多人| 国产成人久久久精品二区三区| 中文字幕亚洲综合久久菠萝蜜| 久久91精品国产91久久小草| 精品伊人久久久| 久久精品18| 久久综合丁香激情久久| 久久99久久99精品免视看动漫| 久久国产福利免费| 久久精品国产亚洲沈樵| 亚洲狠狠婷婷综合久久久久| 国产综合成人久久大片91| 久久青青草原亚洲av无码app| 欧美激情精品久久久久久久九九九 | 91精品国产综合久久精品| 久久夜色精品国产噜噜亚洲a| 国内精品久久久久久久久| 国产精品久久久久久吹潮| 无码精品久久久天天影视| 青青草原综合久久大伊人导航| 久久精品这里热有精品| 7777久久亚洲中文字幕| 99精品久久精品| 国产精品女同久久久久电影院 | 久久久久国产成人精品亚洲午夜| 91精品国产91热久久久久福利| 国产美女久久精品香蕉69| 久久香蕉综合色一综合色88| 99久久精品影院老鸭窝|