找零问题贪心算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 运行结果 四、实验总结 对贪心算法不是特别熟悉,以至于在编写程序时遇到好多错误,好在差不多都改正了,此程序尚有不足之处,希望在以后的深入学习后能编写个更好的程序。