找零问题贪心算法实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

找零问题贪心算法实现

一、实验描述

当前有面值分别为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分。

具体实现:

<

outputFile<

int sum=0;

for (int i=1;i<=number;i++)

{ inputFile>>T[i];

inputFile>>Coins[i];

outputFile<

sum+=T[i]*Coins[i];

}

inputFile>>TotalMoney;

outputFile<<"需要找回的总钱数为: "<

if (T!=NULL && Coins!=NULL)

{ if (sum>=TotalMoney)return true;

else outputFile<<"所有硬币的总钱数是"<

return false;

}

return false;

}

int LeastCoins::changeMoney(int i,int j)

{ if (i>1)

{ if (j

{m[i-1][j]=changeMoney(i-1,j);m[i][j]=m[i-1][j]; return m[i][j]; }

else

{ int X=j/T[i];

X=(X

int T1=changeMoney(i-1,j-X*T[i]);

int T2=changeMoney(i-1,j-(X-1)*T[i]);

m[i-1][j-X*T[i]]=T1;

m[i-1][j-(X-1)*T[i]]=T2;

if ((T1+X)>(T2+X-1)) m[i][j]=T2+X-1;

else m[i][j]=T1+X;

return m[i][j];

}

}

else if(i==1)// 此时 i==1

{ if ((j%T[1])==0 && (j/T[1]<=Coins[1])){ m[1][j]=j/T[1]; return m[1][j]; } else return 1000000;

}

else return 1000000;

}

void LeastCoins::output()

{ if (m[number][TotalMoney]<1000000) // 判断是否有解

{ outputFile<<"需要最少的硬币个数是: "<

outputFile<

}

else outputFile<<"无解"<

}

void LeastCoins::traceback()

{

int j=TotalMoney;

for (int i=number;i>=2;i--)

{

int X=j/T[i]; // 最多需要面值为 T[i] 的硬币的个数

X=(X

int T1=m[i-1][j-X*T[i]]+X;

int T2=m[i-1][j-(X-1)*T[i]]+X-1;

if (T1

{ outputFile<

j-=(X-1)*T[i]; }

}

outputFile<

}

int main()

{ LeastCoins LC;

();

return 0;

}

三、运行结果

图1 运行结果

四、实验总结

对贪心算法不是特别熟悉,以至于在编写程序时遇到好多错误,好在差不多都改正了,此程序尚有不足之处,希望在以后的深入学习后能编写个更好的程序。

相关文档
最新文档