摘要:输入两个整数m和n,从数列1,2,3...n中随意取几个数,使其和等于m,要求将所有可能组合列出来。已知有10分、5分和1分硬币无限个,要求把所有和为n分的组合列出来。1、思路: 定义函数F(n,m)为取n个数和为m的策略有两种选择,分别是F(n-1,m)和F(n-1,m-n)。 1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 template <typename T> 7 void PrintVector(vector<T>& vec) 8 {
阅读全文
摘要:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。(附加:除遍历计数器与a[N] b[N]外,不可使用新的变量,包括栈临时变量、堆空间和全局静态变量等);有一个整数数组,求出连续子数组的和的绝对值的最小值。1、思路: 先从前往后: B[0]=1, B[1]=A[0], B[2]=A[0]×A[1]... 再从后往前: temp = 1, temp *= A[n], B[n - 1] *= temp. 就得到除去n-1个数以外,其他数的乘积。 时间复杂度O(n),空间复杂度O(1),符合题目要求。 1 int M
阅读全文
摘要:计算两个字符串的最长公共子序列(LCS),且公共子序列在字符串中不需要是连续的。计算两个字符串的距离,完全相同的字符串距离为0,可以通过修改一个字符、增加一个字符或删除一个字符三种方式来使两个字符串相同,但这些方式会使得距离加1。1、思路: 详见http://zhedahht.blog.163.com/ 1 int LCS(const char* str1, const char* str2) 2 { 3 int i, j; 4 int len1 = strlen(str1); 5 int len2 = strlen(str2); 6 int **dp = n...
阅读全文
摘要:有N件物品和一个重量为M的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为两个子数组,子数组的元素个数不限,并使两个子数组之和最接近。有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组之和最接近。有两个数组a,b,大小都为n,数组元素的值任意整形数,无序,要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。1、思路: f(i,j)表示前i个物品取任意个放入容量为j的背包中的最大价值。f(i,j)=.
阅读全文
摘要:给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。1、思路: 定义L(i):以ai为最后一个元素的最长子序列的长度。当i=1或ai<min{a1,a2,...,a(i-1)}时,L(i)=1; 当1≤j≤i-1且aj<ai时,L(i)=max{L(j)}+1。时间复杂度O(n2)。LIS 1 #include <iostream> 2 using namespace std; 3 #define len(a) (sizeof(a) / sizeof(a[0]
阅读全文
摘要:有一个整数数组,求出连续子数组的和的最大值。有一个首尾相连的整数数组,求出连续子数组的和的最大值。在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。1、思路: 动态规划思路:用函数f(i)表示以第i个数字结尾的子数组的最大和。当f(i-1)<0时,则以第i个数字结尾的子数组就是第i个数字本身;当f(i-1)>0时,f(i)=f(i-1)+i。虽然我们用递归的方式分析动态规划的问题,但都会基于循环去编码。GreatestSumOfSubArray 1 bool g_InvalidInput = false; 2 3 int FindGreatestSumOfSu
阅读全文