找零钱问题的贪心算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
具体实现
//找零钱算法
//By falcon
//输入:数组m,依次存放从大到小排列的面值数,n为需要找的钱数,单位全部为分
//输出:数组num,对照数组m中的面值存放不同面值的硬币的个数,就找钱方案
public static int[] zhaoqian(int m[],int n)
{
int k=m.length;
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
if (Y==0&&n==0) goto loop1;
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
if (Y==0&&n==0) goto loop1;
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {b=b+1;goto loop3;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
}
} break;
loop4: case 2: m=5;n=i-j;
for(b;b<11;b++)
{
Z=back2[b];
Y=(int)(100*X)+Z;
for(a=0;a<6;a++)
{
if (Y==0&&n==0) goto loop1;
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {b=b+1;goto loop4;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
}
}break;
loop5: case 3: m=5;n=i-j;
}
return 0;
}
找零钱问题的贪心算法
问题描述:
当前有面值分别为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分。
{
int back1[6]={5,10,20,50,100,200};
int back2[11]={15,25,30,40,55,60,70,105,110,120,150};
int back3[13]={35,45,65,75,80,90,115,125,130,140,155,160,170};
int[] num=new int[k];
for(int i=0;i<k;i++)
{
num<i>=n/m<i>;
n=n%m<i>;
}
return num;
}
public class zhaoqian
{
public static void main(String[] args)
{
int m[]={25,10,5,1};
#include <math.h>
#define M 10
using namespace std;
int Coinsbackup[6];
int Coin_Face[6]={5,10,20,50,100,200};
int Number_of_Money(int Coins[6],int Coin_Face[6],double X,int Y,int Z)
} break;
loop3: case 1: m=5;n=i-j;
for(b;b<6;b++)
{
Z=back1[b];
Y=(int)(100*X)+Z;
for(a=0;a<6;a++)
{
Coins[a]=Coinsbackup[a];
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
int n=99;
int[] num=new int[m.length];
num=zhaoqian(m,n);
System.out.println(n+"的找钱方案:");
for(int i=0;i<m.length;i++)
System.out.println(num<i>+"枚"+m<i>+"面值");
{
int k=0;
while(1)
{
int Coins[6],i;
double X,have_money=0.00;
int Y,Z;
for(i=0;i<6;i++)
{
cin>>Coins[i];
have_money+=Coins[i]*Coin_Face[i];
}
if(have_money==0)
return 0;
for(b;b<13;b++)
{
Z=back3[b];
Y=(int)(100*X)+Z;
for(a=0;a<6;a++)
{
Coins[a]=Coinsbackup[a];
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {b=b+1;goto loop7;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
}
}break;
default: ;
}
}
}
loop1: return i;
}
int main()
for(i=0;i<6;i++)
{
Coinsbackup[i]=Coins[i];
}
cin>>X;
if (X>have_money||(int)(100*X)%5!=0)
cout<<"impossible"<<endl;
else
cout<<Number_of_Money(Coins,Coin_Face,X,Y,Z)<<endl;
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
if (Y==0&&n==0) goto loop1;
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {b=b+1;goto loop6;}
}
}break;
loop6: case 4: m=5;n=i-j;
for(b;b<8;b++)
{
Z=back4[b];
Y=(int)(100*X)+Z;
for(a=0;a<6;a++)
{
Coins[a]=Coinsbackup[a];
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
int back4[8]={85,95,135,145,165,175,180,190};
int back5[2]={185,195};
int i;
for(i=1;i>0;i++)
{
int j=0;
loop2: for(j;j<i;j++)
{
int m=5,n=i-j, a,b=0;
switch(j)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
if (Y==0&&n==0) goto loop1;
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {b=b+1;goto loop5;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
}
}break;
loop7: case 5: m=5;n=i-j;
for(b;b<2;b++)
{
Z=back5[b];
Y=(int)(100*X)+Z;
for(a=0;a<6;a++)
{Baidu Nhomakorabea
Coins[a]=Coinsbackup[a];
}
public static int[] zhaoqian(int m[],int n)
{
int k=m.length;
int[] num=new int[k];
for(int i=0;i<k;i++)
{
num<i>=n/m<i>;
n=n%m<i>;
}
return num;
}
}
#include <iostream.h>
Coins[a]=Coinsbackup[a];
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
{
case 0 : Y=(int)(100*X);
for(a=0;a<6;a++)
{
Coins[a]=Coinsbackup[a];
}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;}
while(Coins[m]!=0&&Y>=Coin_Face[m]&&m!=-1)
{ Y=Y-Coin_Face[m];
Coins[m]=Coins[m]-1;
n=n-1;
if (Y==0&&n==0) goto loop1;
else if((Y==0&&n!=0)||(Y!=0&&n==0)) {j=j+1;goto loop2;}
while(Coins[m]==0||Y<Coin_Face[m]){ m--;if(m<0) break;}
相关文档
最新文档