编程环境:c++
1、字符串价值
描述:有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值
例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21
牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。
算法思想:
根据题目要求,要想使得移除固定字符个数后,字符串的价值最小,那么每次移除的都应该是当前的字符串中出现次数最多的字符。首先对字符串出现的字符数进行统计,每次移除一个后,需要对统计字符出现次数的数组重新进行排序,确保每次溢出的都是出现次数最多的字符串即可。最后按照字符串价值公式,计算得到最终的字符串最小价值。
部分代码实现:
2、下厨房
描述:
牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
输入描述:每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。
算法思想:
题目输入的行数不确定,需要自行判断是否还有字符串输入,这里我省却了行的概念,将所有需要的食材存储到一个字符串数组中。对于所有的食材,我们需要对其进行去重操作,得到需要准备的食材个数。首先将所有的字符串排序,那么相同的食材将会聚集到一起,遍历排序后的字符串数组,当相邻元素不同时,则代表不同的食材(计数+1)。遍历完成得到的即为去重后所需食材个数。
3、资产包打包
描述:
在金融资产交易中,经常涉及到资产包的挑选打包。在资产包打包过程中,每种类型的资产有固定的数量与价值,需选择某几种资产打包,使得资产包总价值最大。打包时每种资产只能整体打包,不能分割。假设现有可容纳M条资产的资产包,另外有N种资产。资产Na数量为Ta条,总价值为Va元;资产Nb数量为Tb条,总价值为Vb元;资产Nc数量为Tc条,总价值为Vc元......;资产Nn数量为Tn,总价值为Vn。编写算法,挑选哪些类型资产放入资产包可使得资产包总价值最大?
算法思想:
由于资产包只能选择整体放入或者不放,所以题目其实是一个0/1背包的动态规划问题。设j为总容量,wi为第i件物品重量。如果背包的总容量j小于第i件物品的所占空间,此时所能获得的最大价值相当于考虑第1到第i-1件物品放入总容量为j的背包。否则,可以选择放或不放第i件物品:如果不放第i件物品,此时最大价值与只放前i-1件相同;第i件物品放进背包时,总容量为j的背包必须分配wi的空间给第i件物品,而之前的第1到第i-1物品是只能放在总容量为j-wi的背包中,两种情况取大值。初始化一个结果数组dp,有递推式:dp(i,j)=max {dp(i-1, j),dp(i-1, j-w)+vi}
代码部分实现: