1-2-5组合问题的最高效完整算法

        1-2-5组合问题的最高效完整算法       
94人阅读 评论(3) 收藏 举报

问题描述:用1,2,5这三个数组合,和为N。1,2,5的个数自己定,求有多少种不同的组合方法?

  1. /************************************************************************
  2. ***By       : Summon                                                  ***
  3. ***Data     : 2010.01.17                                              ***
  4. ***Function : 1-2-5组合之和等于100,文总共有多少种                           ***
  5. ***           组合方式。                                                      ***
  6. ***Method   : 首先使用蛮力发,复杂度O(n^3/)                              ***
  7. ***           其次使用蛮力法的改进,复杂度O(n^2)                          ***
  8. ***           最后是超级算法,复杂度O(n)                            ***                                                                    
  9. /************************************************************************/ 
  10. #include "stdafx.h" 
  11. #include <stdio.h> 
  12. #include <stdlib.h> 
  13. #include <string.h> 
  14. #include <time.h> 
  15.  
  16. typedef int STATUS; 
  17.  
  18. STATUS FoolHardinessMethod(int N, int *result); 
  19. STATUS FoolHardinessMethodImproved(int N, int *result); 
  20. STATUS SuperMethod(int N, int *result); 
  21.  
  22. int main(int argc, char* argv[]) 
  23.     clock_t start; 
  24.     clock_t end; 
  25.     double realTime; 
  26.     int N; 
  27.  
  28.     printf("Please input the N!/n"); 
  29.     fflush(stdin); 
  30.     scanf("%d", &N); 
  31.  
  32.     int result = 0; 
  33.     start = clock(); 
  34.     FoolHardinessMethod(N, &result); 
  35.     end = clock(); 
  36.     realTime = ((double)(end - start))/CLOCKS_PER_SEC; 
  37.     printf("N= %d/n", N); 
  38.     printf("FoolHardinessMethod Running Time = %f/n", realTime); 
  39.     printf("result = %d/n", result); 
  40.     printf("/n");     
  41.  
  42.     start = clock(); 
  43.     FoolHardinessMethodImproved(N, &result); 
  44.     end = clock(); 
  45.     realTime = ((double)(end - start))/CLOCKS_PER_SEC; 
  46.     printf("N= %d/n", N); 
  47.     printf("FoolHardinessMethodImproved Running Time = %f/n", realTime); 
  48.     printf("result = %d/n", result); 
  49.     printf("/n"); 
  50.  
  51.     start = clock(); 
  52.     SuperMethod(N, &result); 
  53.     end = clock(); 
  54.     realTime = ((double)(end - start))/CLOCKS_PER_SEC; 
  55.     printf("N= %d/n", N); 
  56.     printf("SuperMethod Running Time = %f/n", realTime); 
  57.     printf("result = %d/n", result); 
  58.     printf("/n"); 
  59.  
  60.     return 1; 
  61.  
  62. STATUS FoolHardinessMethod(int N, int *result) 
  63.     if (result == NULL) 
  64.     { 
  65.         return 0; 
  66.     } 
  67.  
  68.     int N1 = N/1; 
  69.     int N2 = N/2; 
  70.     int N5 = N/5; 
  71.     *result = 0; 
  72.  
  73.     for (int i=0; i<=N5; i++) 
  74.     { 
  75.         for (int j=0; j<=N2; j++) 
  76.         { 
  77.             for (int k=0; k<=N1; k++) 
  78.             { 
  79.                 if (5*i + 2*j + k == N) 
  80.                 { 
  81.                     *result += 1; 
  82.                 } 
  83.             } 
  84.         } 
  85.     } 
  86.     return 1; 
  87.  
  88. STATUS FoolHardinessMethodImproved(int N, int *result) 
  89.     if (result == NULL) 
  90.     { 
  91.         return 0; 
  92.     } 
  93.  
  94.     int N2 = N/2; 
  95.     int N5 = N/5; 
  96.     *result = 0; 
  97.  
  98.     for (int i=0; i<=N5; i++) 
  99.     { 
  100.         for (int j=0; j<=N2; j++) 
  101.         { 
  102.             if (((N - 5*i - 2*j) >= 0) && ((N - 5*i - 2*j) <= N)) 
  103.             { 
  104.                 *result += 1;  
  105.             } 
  106.         } 
  107.     } 
  108.     return 1; 
  109.  
  110. STATUS SuperMethod(int N, int *result) 
  111.     if (result == NULL) 
  112.     { 
  113.         return 0; 
  114.     } 
  115.  
  116.     *result = 0; 
  117.      
  118.     for (int i=0; i<=N; i+=5) 
  119.     { 
  120.         *result += (i+2)/2; 
  121.     } 
  122.  
  123.     switch (N%5) 
  124.     { 
  125.     case 0:  
  126.         { 
  127.             break
  128.         } 
  129.     case 1: 
  130.         { 
  131.             *result += (1*(N - N%5))/10; 
  132.             break
  133.         } 
  134.     case 2: 
  135.         { 
  136.             *result += (2*(N - N%5))/10 + 1; 
  137.             break
  138.         } 
  139.     case 3: 
  140.         { 
  141.             *result += (3*(N - N%5))/10 + 1; 
  142.             break
  143.         } 
  144.     case 4:  
  145.         { 
  146.             *result += (4*(N - N%5))/10 + 2; 
  147.             break
  148.         } 
  149.     } 
  150.     return 1; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值