摘要: 0-1背包问题是一个典型的动态规划问题。描述如下:现在又一个可以载重量为M的背包,另外有N个物品,每个物品重量和价值分别为w[i]和v[i],现在要求选择物品放入背包,使其在不超过重量的情况下有最大价值。问题的递推表达式如下:设C为当前背包的容量。 当w[n] > C时, f(n, C) = f(n-1, C) 当w[n] <=C时, f(n, C) = max{f(n-1, C), v[n] + f(n-1, C-w[n])}可以利用上式得到采用递归方法计算函数f的代码,递归结束是:f(i, 0) = 0或 f(0, j)=0.另外也可以根据上面的最优子结构采用动态规划的方法,使 阅读全文
posted @ 2012-09-26 20:21 dandingyy 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 1.有这样的乘法算式: 人过大佛寺 * 我 = 寺佛大过人 每一个字都代表一个数字,不同的字表示不同的数字,找出这些数字。 解法:使用暴力搜索的方法,(因为这两天再看Python,所以刚好用Python写了下这个简单的程序): 找到的是 21978, 4 1 def checkN(n): 2 nums = [] 3 while n > 0: 4 cur = n % 10 5 if cur in nums: 6 return True 7 else: 8 nums.append(... 阅读全文
posted @ 2012-09-17 21:07 dandingyy 阅读(855) 评论(0) 推荐(0) 编辑
摘要: 逆序数求解,同于POJ2299题。常规做法是使用O(N^2)的两重循环,逐个遍历for i = (0, N) for j = (i+1, N) if(a[i] > a[j]) count++;return count;推荐的做法是使用类似于归并排序的方法,可以再O(NlogN)内算出。输入格式:5(个数) 910543(个数)1 230(个数为0表示结束) 1 #include<cstdio> 2 #include<iostream> 3 #include<fstream> 4 using namespace std; 5 6 #define MAX 阅读全文
posted @ 2012-09-16 23:27 dandingyy 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 题目描述(即判断是否是合理的出栈序列问题?)有顺序排列的1,2, 3,…,n节车厢在入站口等待调度。车站设置了一个栈作为缓冲,这样的话只可能进行下列两个操作之一:(1)如果还有车厢在入站口,将最前面的入栈缓冲(2)将栈顶的车厢驶出车站 给定一个1至n的排列,问其作为出站序列是否合法。注意:入站顺序为1,2, 3,…,n,即1先入栈...,n最后入栈。输入输入包含若干测试用例。每一个测试用例由多行组成。第一行是两个整数n(1<=n <= 100)和m,n表示入站序列为1至n。m表示随后有m行出站序列。当n,m均为0时表示输入结束。输出对应每一个出站序列,合法则输出一行YES,否则输出 阅读全文
posted @ 2012-09-16 21:49 dandingyy 阅读(2238) 评论(0) 推荐(0) 编辑
摘要: 求两个正整数的最大公约数?设要求x,y(x>y)的最大公约数,并且有 x = k*y+b.—— x % y = b解法一:辗转相除法一个基本的方法就是辗转相除法:x与y的最大公约数就是y和b的最大公约数。算法不断递归进行,直到b的值为0,此时y的值就是最大公约数。 使用递归方法: int gcd(int x, int y) { if(x < y) return gcd(y, x); if(y <= 0) return x; return gcd(y, x%y); } 使用迭代方法:int gcd(int x, int y){ if(x < y... 阅读全文
posted @ 2012-09-12 23:14 dandingyy 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 首先,该题中一个机器中只有一个记录,如果机器出故障,就缺失了该ID记录的一个备份。 这个问题实际上与在10亿个数中找出只出现零次,一次,两次,N次......的问题相同。(在《编程珠玑》第二章中遇到过寻找在文件中出现过0次的数的问题) 并且我们知道有如下假设:1)10亿个ID一定每个都出现过;2)大部分ID的出现次数与备份数有关;3)小部分出现0次或1次的ID一定就是该ID对应的机器出现了故障解法一:普通的遍历搜索方法。 使用一个10亿长的数组 a[N],遍历得到的ID列表,出现了一次ID,就将对应的a[ID]++,最后值为1的项就是要寻找的ID。——时间复杂度和空间复杂度均为O(N... 阅读全文
posted @ 2012-09-12 12:30 dandingyy 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 1.问题:设计一个数据结构,能够有序存储一组整数,便于我们查找,类似与STL中的set集合 集合建立时,传入两个参数,一个是maxNumbers,表示集合元素的最大个数,另一个是maxValue,表示集合元素的范围,所有元素都小于maxValue,maxValue会被用作哨兵。 在后面的程序中,虽然设置了默认值INT_MAX,但最好不要使用,因为它可能会使程序效率很低,特别是位图法中2.实现 2.1采用STL中的set模板实现,在实际编程中完全可以直接使用set集,这里为了与后面的实现和测试保持一致,对set进行了封装。封装类IntSetSTL如下: 1 class IntSetSTL ... 阅读全文
posted @ 2012-09-09 19:05 dandingyy 阅读(547) 评论(0) 推荐(0) 编辑
摘要: 1.问题 抽象后的问题如下:输入两个整数m和n,(m < n).输出0~n-1范围内的m个随机整数的有序列表,不允许重复。 也就是说,要对0~n-1范围内的数字进行选择,每个数字被选中的概率相等. 有两点要注意:不允许重复,结果有序;2.解决方案 2.1已有知识 利用库函数<stdlib.h>中的rand()函数可以产生0到RAND_MAX范围内的随机整数。 RAND_MAX是在前面头文件中定义的宏,具体大小与实现有关,至少为32767(2^15-1). 一般32位机,int型为4字节,故RAND_MAX大小为2147483647(2^31-1). 两个相关函数: 产生... 阅读全文
posted @ 2012-09-09 19:04 dandingyy 阅读(1973) 评论(0) 推荐(1) 编辑
摘要: 这部分主要讲述排序算法,先给出两个库函数排序:C库函数<stdlib.h>: void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );如:1 int values[] = { 40, 10, 100, 90, 20, 25 };2 3 int compare (const void * a, const void * b)4 {5 return ( *(int*)a - *(int*)b );6 }7 ////////////// 阅读全文
posted @ 2012-09-09 15:33 dandingyy 阅读(1068) 评论(0) 推荐(0) 编辑
摘要: 如果我们需要很大范围的十进制整数加法,对于4字节int型,不能表示该数据,此时需要用字符串保存操作数和结果,采取逐位运算的方式。如: 987654321 + 1234567989 = 1111111110 -1234 + (-4567) = -5801 -1234 + 30 = -1204 0 + 0 = 0 0 + 34 = 34. 实现函数void add(const char *num1, const char *num2, char *result). 注:输入字符串所有位均为有效数字,不存在由0开始的串。要求输出所有位也是有效数组。 正数前没有符号,负数在最开... 阅读全文
posted @ 2012-09-08 21:26 dandingyy 阅读(5702) 评论(0) 推荐(0) 编辑