
目录
贪心算法(greedy algorithm ,又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 。
币种:1 2 4 5 10 若干张,找零:n元。输出找零方案
思路:
(1)因为贪心是要找到最优解,所以我们要从最大的币值开始寻找
(2)每次找到符合条件的币值时,就让n减去已经找到的钱,然后继续循环,直到n不大于0时停止
import java.util.Scanner;
public class Greed {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
greedy(n);
}
public static void greedy(int n) {
int[] money = {10, 5, 4, 2, 1};//钱的面值,从大到小,因为要找最优解。
int i = 0;//表示目前用money数组中哪一个面值的钱去找零,最开始从10快开始。
int[] num = new int[money.length];
while (n > 0) {//n>0说明钱还没有找完,所以继续循环
if (n >= money[i]) {//剩余要找的钱必须大于等于当前money[i]这个面值
int zs = n / money[i];
n -= zs * money[i];
num[i]+= zs;//当前这个面值的数量加上zs
} else{//如果当前面值不能找开就i++
i++;
}
}
for (int j = 0; j < num.length; j++) {//输出
if (num[j] > 0) {//说明当前这个面值的钱使用到了,所以才能输出
System.out.printf("面值:%d 张数:%d ", money[j], num[j]);
}
}
}
}
假如整数n表示当前奖池中已经有的钱的总数,请你从n中删除m个数字,余下的数值对应的金额就是可以拿走的钱,我们知道人性是贪婪的,那么请帮助小明,使得余下的数字按原次序组成的新数最大。
比如当n = 92081346718538,m = 10时,则新的最大数是9888
样例输入:
92081346718538 10
1008908 5
样例输出:
9888
98
思路:
(1)先将删除问题变成保留问题,利用贪心的思想,每次在非保留的个数外寻找最大值
(2)假设输入92081346718538 10,所以我们要在14个数中删除10个,所以我们可以在前11个数中选择一个最大值,然后下次循环在从这个最大值到第12个数中寻找最大的数,直到for循环的i等于被保留的数时停止。
import java.util.Scanner;
public class selectMaxNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String n = scanner.next();//输入n为String类型
int m = scanner.nextInt();//输入需要删除数的个数
if (n.length() <= m) {
System.out.println("输入错误,请重新输入");
}
char[] a = n.toCharArray();//将String类型的数转为char数组,为了循环判断使用
String max = "";//定义max变量存放最后早到的最大数
int retain = a.length - m;//将删除问题变成保留问题
int lastselect = -1;//存放最大数在数组中的位置,开始的时候定义为-1,在循环时在+1就从0开始了
for (int i = 1; i <= retain; i++) {
char big = '0';//循环比较前先假设big为最小的值
for (int j = lastselect + 1; j < a.length - (retain - i); j++) {
//这里lastselect+1主要是因为在找到一个最大的数后下次循环就从这个最大数的下一个开始
/*
j < a.length - (retain - i)这个区间判断方法是
第一次循环判断的范围是j < 11,也就是0到10,因为总共有14个数,需要保留四个,
所以第一次就需要在前11个中选择一个最大的数,然后每次循环结束范围都要往后移一位
例如:92081346718538删掉十个数,第一次循环判断在92081346718中
第二次循环判断在20813467185中,第三次在134671853中,第四次就在538中
*/
if (a[j] > big) {
big = a[j];
lastselect = j;//找到大的数就将j赋给存放最大数地址的这个变量
}
}
max += big;//每次找出那个最大的数后就拼接到max中
}
System.out.println(max);
}
}
}
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆,多多决定把所有的果子合成堆,每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有果子经过n-1次合并后,就只剩下了一堆,多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能的节省体力,假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务就是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小体力的值。
输入:第一行:一个整数n(1<=n<=100),表示果子的种类数。第二行:包含n个整数,用空格分隔。n等于0时自动退出
思路:
(1)如果n==0就停止,n==1就直接输出重量
(2)如果n>1就循环,首先将数组从小到大排序,然后每次循环都将数组的第一个数和第二个数相加,空余的位置给无限大,这样就可以循环相加了。
import java.util.Arrays;
import java.util.Scanner;
public class pileFruit {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();//输入果子总共的堆数
int[] m = new int[n];//表示n堆果子重量的数组
if (n == 0) break;//n==0时直接结束
if (n == 1) {
//如果只有一堆果子,就直接输出这堆果子的重量
System.out.println(scanner.nextInt());
continue;
}
for (int i = 0; i < n; i++) {
m[i] = scanner.nextInt();//输入每堆果子的重量
}
int sum = 0;//记录总共搬运的重量
for (int i = 0; i < n - 1; i++) {//循环n-1次,例如三堆果子只需要搬2次
Arrays.sort(m);//将m数组排序
sum = sum + m[0] + m[1];//先从最轻的开始合并
m[0] += m[1];//搬完后m[0]就表示合并后的重量
m[1] = Integer.MAX_VALUE;//然后m[1]给无穷大,这样每次循环就会到数组最后
System.out.println(Arrays.toString(m));//查看数组数的排序
}
System.out.println(sum);
}
}
}

可以看出输出了每次排序前的数组,也输出了最后总共消耗的体力。

目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s
下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen
为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti
我正在开发一个类似微论坛的项目,其中一个特殊用户发布一条快速(接近推文大小)的主题消息,订阅者可以用他们自己的类似大小的消息来响应。直截了当,没有任何形式的“挖掘”或投票,只是每个主题消息的响应按时间顺序排列。但预计会有很高的流量。我们想根据它们引起的响应嗡嗡声来标记主题消息,使用0到10的等级。在谷歌上搜索了一段时间的趋势算法和开源社区应用示例,到目前为止已经收集到两个有趣的引用资料,但我还没有完全理解它们:Understandingalgorithmsformeasuringtrends,关于使用基线趋势算法比较维基百科页面浏览量的讨论,在SO上。TheBritneySpearsP
我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts
文章目录一.Dijkstra算法想解决的问题二.Dijkstra算法理论三.java代码实现一.Dijkstra算法想解决的问题解决的问题:求解单源最短路径,即各个节点到达源点的最短路径或权值考察其他所有节点到源点的最短路径和长度局限性:无法解决权值为负数的情况二.Dijkstra算法理论参数:S记录当前已经处理过的源点到最短节点U记录还未处理的节点dist[]记录各个节点到起始节点的最短权值path[]记录各个节点的上一级节点(用来联系该节点到起始节点的路径)Dijkstra算法步骤:(1)初始化:顶点集S:节点A到自已的最短路径长度为0。只包含源点,即S={A}顶点集U:包含除A外的其他顶
对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.
我正在尝试计算由二进制形式的1和0的P数表示的数字的数量。如果P=2,则表示的数字为0011、1100、0110、0101、1001、1010,所以计数为6。我试过:[0,0,1,1].permutation.to_a.uniq但这不是大数的最佳解决方案(P可以什么可能是最好的排列技术,或者我们是否有任何直接的数学来做到这一点? 最佳答案 Numberofpermutationcanbecalculatedusingfactorial.a=[0,0,1,1](1..a.size).inject(:*)#=>4!=>24要计算重复项,