「java贪心算法找零」java贪心算法几个经典例子

博主:adminadmin 2023-01-06 14:39:10 989

今天给各位分享java贪心算法找零的知识,其中也会对java贪心算法几个经典例子进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

贪心算法(硬币找零问题)

小Q手上有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,他希望带尽量 少的硬币,但是要能组合出 1 到 m 之间的任意值。输入的第一行为两个整数: m 和 n ,他们的意义如题目描述。 接下来的 n 行,每行一个整数,第 i+1 行的整数表示第 i 种硬币的面值。输出的最少需要携带的硬币数量,如果无解则输出 -1 。

50% 的数据: 1=n=10 , 1=m=10^3 ;

100% 的数据: 1=n=100 , 1=m=10^9 ;

数据量很大,dp不好做,也不好压缩,应该采用贪心的思路。首先如果没有面值为 1 的硬币必定无法满足要求可以直接输出 -1 ,接下来考虑贪心策略,设想如果能够组合出 1 到 5 之间的任何数值,只要一个 6 的硬币就能组合出 1 到 11 的任意值,既如果当前能够组合出 1 到 n 的硬币,再加入一个 n+1 面值的银币就能组合出 1 到 n+n+1 的所有面值。所以基本思路就是用一个变量 cur 存储当前能表示的面值,将硬币排序,从大往小找到第一个小于等于 cur+1 的硬币,硬币数加一同时更新 cur ,当 cur 大于 m 时输出。

找零钱问题的贪心算法

问题描述:

当前有面值分别为2角5分,1角,5分,1分的硬币,请给出找n分钱的最佳方案(要求找出的硬币数目最少)

问题分析:

根据常识,我们到店里买东西找钱时,老板总是先给我们最大面值的,要是不够再找面值小一点的,直到找满为止。如果老板都给你找分数的或者几角的,那你肯定不干,另外,他也可能没有那么多零碎的钱给你找。其实这就是一个典型的贪心选择问题。

问题的算法设计与实现:

先举个例子,假如老板要找给我99分钱,他有上面的面值分别为25,10,5,1的硬币数,为了找给我最少的硬币数,那么他是不是该这样找呢,先看看该找多少个25分的, 99/25=3,好像是3个,要是4个的话,我们还得再给老板一个1分的,我不干,那么老板只能给我3个25分,由于还少给我24,所以还得给我2个10分的和4个1分。

具体实现

//找零钱算法

//By falcon

//输入:数组m,依次存放从大到小排列的面值数,n为需要找的钱数,单位全部为分

//输出:数组num,对照数组m中的面值存放不同面值的硬币的个数,即找钱方案

如何证明找零钱问题的贪婪算法总能产生具有最少硬币数的零钱

pre t="code" l="java" private static final int[] m = {100,50,20,10,5,2,1};

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int f = scanner.nextInt();

int[] amount = new int[f];

for(int i = 0 ; i f;i++){

amount[i] = giveChange(scanner.nextInt());

}

for(int i = 0 ; i amount.length;i++){

System.out.println(amount[i]);

}

}

public static int giveChange(int n) {

int num=0;

for(int i=0;im.length;i++){

num+=n/m[i];

n=n%m[i];

}

return num;

}

【JS算法】贪心算法

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择

举个简单的贪心算法: 柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。每位顾客只买一杯柠檬水,然后向你付

5 美元或10 美元或 20 美元。

你必须给每个顾客正确找零,注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false

找零钱问题 [贪心算法](java实现)

public getMin{

public int MinNumber=0;

public int findMax(int[] a){

for(int i=0;ia.length;i++){

if(a[i]==0) return a[--i];

}

return a[a.length-1];

}

public boolean Compare(int a,int b){

public boolean flag=true;

if(ab) flag=flase;

return flag;

}

public int getMinNumber(int[] M,int Money){

int[] findM=new int[M.length];

int index=0;

for(int i=0;iM.length;i++){

boolean f = this.Compare(M[i],money)

if(f) findM[index++]=M[i];

}

int max = this.findMax(findM);

MinNumber++;

if((Money-max)!=0) {

getMinNumber(M,Money-max)

}

return MinNumber;

}

public int[] Start(){

System.out.println("请输入查询组数");

int group=System.in.read();

int[] M={1,2,5,10,20,50,100};

int[] Result = new Int[group];

int index=0;

while (group-- 0){

System.out.println("请输入金额");

int money=System.in.read();

Result[index++] = getMinNumber(M,money);

MinNumber=0;

}

}

public void print(int[] MinNumber){

for(int i=0;iMinNumber.length.i++){

System.out.println(MinNumber[i]+" ");

}

}

}

public static void main(String[] args){

new getMin().print(new getMin().Start());

}

没测试啊,有问题请勿喷,呵呵

贪婪法算法,求找零的最优方案,即从面值最大的开始找零!面值为:100元,50元,10元,5元,1元,0.5,0.1

我帮你把代码修改了一下

#includestdio.h#includestdlib.h

#define Max 8

void exchange(double,int[]);

double moneyValues[Max]={100,50,20,10,5,1,0.5,0.1};

int main(){

int i;

int store[Max]={0};

double money;

printf("Input money that you will exchange!:");

scanf("%lf",money);

double premoney=money;

exchange(money,store);

printf("%f \n",premoney);

for(i=0;iMax;i++){

if(store[i]0)

 printf("%d : %f\n",store[i],moneyValues[i]);

}

return 1;

}

void exchange(double exmoney,int store[]){

int i;

for(i=0;iMax;i++) { 

if(exmoneymoneyValues[i]) break;

}

while(exmoney0  iMax) {

if(exmoneymoneyValues[i]){

 exmoney-=moneyValues[i];

 store[i]++;

}else if(exmoney0.1  exmoney0.05){

 store[Max-1]++;

 break;

}

else i++;

}

return;

}

然后,我觉得有些地方你写得啰嗦了,帮你简化了一下

#includestdio.h#includestdlib.h

#define Max 8

void exchange(double,int[]);

double moneyValues[Max]={100,50,20,10,5,1,0.5,0.1};

int main(){

int i;

int store[Max]={0};

double money;

printf("Input money that you will exchange!:");

 scanf("%lf",money);

exchange(money,store);

printf("%f\n",money);

for(i=0;iMax;i++){

if(store[i]0)

 printf("%d : %f\n",store[i],moneyValues[i]);

}

return 1;

}

void exchange(double money,int store[]){

int i=0;

while(money0  iMax) {

if(moneymoneyValues[i]){

 money-=moneyValues[i];

 store[i]++;

}else if(money0.1  money0.05){

 store[Max-1]++;

 break;

}

else i++;

}

return;

}

关于java贪心算法找零和java贪心算法几个经典例子的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。