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

转载 2012年03月22日 18:48:22
        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; 

相关文章推荐

整型数组处理算法(十三)求出用1,2,5这三个数不同个数组合的和为100的组合个数(华为校园招聘题)

这其实,是一种方法,在我们解决问题的时候,如果进度紧,性能要求也不高,可以选择最简单的方式来实现它,当功能实现后,可以在花时间来优化,完善。同时,对新的算法也可以用以前简单的方法来验证。这只是一个简单...

row_number over(order by id desc)语句进行存储过程高效分页,百度分页(1,2,3,4,5....)

模仿百度分页示意效果图: sql procdure code: create   proc [dbo].[MyPages](  @tableName varchar(155),  @pag...

1 2 5组合100,有多少种方法

问题描述:用随意多个1 2 5三个数字的组合,使其值为100,有多少种组合方法?         基础解法:穷举法,1穷举100次,2穷举50次,5穷举20次,这种方法总共穷举的次数为100*50*...

第9周项目6-穷举法解决组合问题(1,2)

/*   * Copyright (c) 2014, 烟台大学计算机学院   * All rights reserved.   * 文件名称:test.cpp   * 作    者:刘畅    * 完...

【阿里巴巴面试题】求1,2,2,3,4,5能够组合得到的不同数

今天同事问了我一道阿里面试题,题目如下:编程实现:有 1,2,2,3,4,5 六个数字,请输出它们所有不同的排序结果,如“322145”、“232154”等,其中 4 不能在第三位, 3 与 5 不能...
  • BusyCai
  • BusyCai
  • 2011年03月19日 16:26
  • 3245

C++ & Pascal & Java ——NOIP2016提高组day2 t1——组合数问题

题目描述 组合数  表示的是从 n 个物品中选出 m 个物品的方案数。举个例子,从 (1,2,3) 三个物品中选择两个物品可以有 (1,2),(1,3),(2,3) 这三种选择方法。根据组合数的定义...

NOIP2016Day2T1组合数问题洛谷p2822解题报告

原题见洛谷(https://www.luogu.org/problem/show?pid=2822) NOIP第二天第一题用到了数论的知识: 50分算法 最暴力的做法是直接用公式,求阶乘...

NOIP2016Day2T1组合数问题(problem)

开头提示:本文章为作者原创,若有雷同,纯属巧合,谢谢! 注:组合数公式由于作者太懒而没有打出,因此带来的不便作者深表歉意! 【问题描述】 组合数表示的是从n个物品中选出m个物品的方案数。举个...
  • tgxkdss
  • tgxkdss
  • 2017年01月27日 12:22
  • 160
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1-2-5组合问题的最高效完整算法
举报原因:
原因补充:

(最多只允许输入30个字)