1-2-5组合问题的最高效完整算法
2010-01-17 16:11
309 查看
问题描述:用1,2,5这三个数组合,和为N。1,2,5的个数自己定,求有多少种不同的组合方法?
其中第三种算法的思路参考:http://blog.csdn.net/sailor_8318/archive/2008/10/22/3120812.aspx
但是以上博客中提到的方法仅仅适用于N能够被5整除时,本算法进一步解决了N为任意正整数时的情况。
总体的思路就是利用N与(N - N%5)之间的关系。
/************************************************************************ ***By : Summon *** ***Data : 2010.01.17 *** ***Function : 1-2-5组合之和等于100,文总共有多少种 *** *** 组合方式。 *** ***Method : 首先使用蛮力发,复杂度O(n^3/) *** *** 其次使用蛮力法的改进,复杂度O(n^2) *** *** 最后是超级算法,复杂度O(n) *** /************************************************************************/ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> typedef int STATUS; STATUS FoolHardinessMethod(int N, int *result); STATUS FoolHardinessMethodImproved(int N, int *result); STATUS SuperMethod(int N, int *result); int main(int argc, char* argv[]) { clock_t start; clock_t end; double realTime; int N; printf("Please input the N!/n"); fflush(stdin); scanf("%d", &N); int result = 0; start = clock(); FoolHardinessMethod(N, &result); end = clock(); realTime = ((double)(end - start))/CLOCKS_PER_SEC; printf("N= %d/n", N); printf("FoolHardinessMethod Running Time = %f/n", realTime); printf("result = %d/n", result); printf("/n"); start = clock(); FoolHardinessMethodImproved(N, &result); end = clock(); realTime = ((double)(end - start))/CLOCKS_PER_SEC; printf("N= %d/n", N); printf("FoolHardinessMethodImproved Running Time = %f/n", realTime); printf("result = %d/n", result); printf("/n"); start = clock(); SuperMethod(N, &result); end = clock(); realTime = ((double)(end - start))/CLOCKS_PER_SEC; printf("N= %d/n", N); printf("SuperMethod Running Time = %f/n", realTime); printf("result = %d/n", result); printf("/n"); return 1; } STATUS FoolHardinessMethod(int N, int *result) { if (result == NULL) { return 0; } int N1 = N/1; int N2 = N/2; int N5 = N/5; *result = 0; for (int i=0; i<=N5; i++) { for (int j=0; j<=N2; j++) { for (int k=0; k<=N1; k++) { if (5*i + 2*j + k == N) { *result += 1; } } } } return 1; } STATUS FoolHardinessMethodImproved(int N, int *result) { if (result == NULL) { return 0; } int N2 = N/2; int N5 = N/5; *result = 0; for (int i=0; i<=N5; i++) { for (int j=0; j<=N2; j++) { if (((N - 5*i - 2*j) >= 0) && ((N - 5*i - 2*j) <= N)) { *result += 1; } } } return 1; } STATUS SuperMethod(int N, int *result) { if (result == NULL) { return 0; } *result = 0; for (int i=0; i<=N; i+=5) { *result += (i+2)/2; } switch (N%5) { case 0: { break; } case 1: { *result += (1*(N - N%5))/10; break; } case 2: { *result += (2*(N - N%5))/10 + 1; break; } case 3: { *result += (3*(N - N%5))/10 + 1; break; } case 4: { *result += (4*(N - N%5))/10 + 2; break; } } return 1; }
其中第三种算法的思路参考:http://blog.csdn.net/sailor_8318/archive/2008/10/22/3120812.aspx
但是以上博客中提到的方法仅仅适用于N能够被5整除时,本算法进一步解决了N为任意正整数时的情况。
总体的思路就是利用N与(N - N%5)之间的关系。
相关文章推荐
- 1-2-5组合问题的最高效完整算法
- 排列组合问题的通用算法
- 八数码问题高效算法(人工智能实验)
- 算法学习-组合问题递归解法
- 大数乘法问题及其高效算法
- 一天一道算法题--6.17--组合问题
- c语言实现排列组合算法问题
- N皇后问题的两个最高效的算法
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 算法:求比指定数大且最小的“不重复数”问题的高效实现
- N皇后问题的两个最高效的算法
- 排列组合之排列问题的算法实现
- C/C++面试之算法系列--如何利用数学思想解1/2/5组合问题
- c语言实现排列组合算法问题
- 算法:求比指定数大且最小的“不重复数”问题的高效实现
- 最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;
- 浅谈部分搜索+高效算法在搜索问题中的应用 by 楼天城
- 算法——使用递归解决组合问题
- Golang排列组合算法问题之全排列实现方法
- N皇后问题的两个最高效的算法