作者:吾爱九-九九 | 来源:互联网 | 2024-11-07 15:43
本文探讨了在硬币找零问题中使用枚举法的具体应用。具体而言,题目要求将一定数额的零钱换成5分、2分和1分的硬币,并且每种硬币至少需要使用一枚。研究旨在找出所有可能的换法组合。输入数据为一行,包含一个在8到100之间的整数,表示待换的零钱数额。通过详细的枚举分析,本文提供了高效的解决方案,并验证了其在实际应用中的可行性和有效性。
题目
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量,
fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例
13
输出样例
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
代码如下:
#include
using namespace std;
int main(){int x;cin>>x; int count&#61;0; int ff,tf,of;int array[1000][4];int i &#61; 0;for(int ff &#61; 1;ff <&#61; x/5;ff&#43;&#43;){for(int tf &#61; 1; tf <&#61; (x - ff*5)/2 ;tf&#43;&#43;){of &#61; x - ff*5 - tf*2;if(of >&#61; 1){array[i][0] &#61; ff;array[i][1] &#61; tf;array[i][2] &#61; of;array[i][3] &#61; ff&#43;tf&#43;of;count&#43;&#43;;i&#43;&#43;;}}}for(i &#61; count-1;i >&#61; 0;i--)cout<<"fen5:"<<array[i][0]<<", fen2:"<<array[i][1]<<", fen1:"<<array[i][2]<<", total:"<<array[i][3]<<endl;cout<<"count &#61; "<<count<<endl;
}
需要注意的是&#xff0c;for循环中判断条件是<&#61;&#xff0c;包括“&#61;”&#xff0c;以及注意题目中提及了倒序输出&#xff0c;所以我选择用数组存储后倒序输出。当然也可以让for循环中ff从x/5开始&#xff0c;不断自减直到1为止&#xff08;每一个最少需要一枚&#xff09;&#xff0c;这样相较来说比较省空间。