题目:硬币面值组合
【题目描述】
使用1角、2角、5角硬币组成 n 角钱。
设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。
输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
时间限制:1000
内存限制:65536
输入
一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出
输出有若干行,每行的形式为: i a b c 第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例输入
10
样例输出
001 10 0 0
002 8 1 0
003 6 2 0
004 4 3 0
005 2 4 0
006 0 5 0
007 5 0 1
008 3 1 1
009 1 2 1
010 0 0 2
【思路】
这道题其实也可以使用枚举的方法来做,但是考虑了一下,还是使用递归的思路来做了。其实归根结底源头还是枚举的办法,只不过是通过递归的方法实现的枚举。
【代码】
#include<bits/stdc++.h>
using namespace std;
int ans;
int a[4];//a[1] - 1角 a[2] - 2角 a[3] - 5角
void print(){
if(ans < 10){
cout<<"00";
}else if(ans < 100){
cout<<"0";
}
cout<<ans;
for(int i=1;i<=3;i++){
cout<<setw(12)<<a[i];
}
cout<<endl;
}
void dfs(int x,int step){
if(x == 0 && step == 4){
ans++;
print();
}else{
if(step == 1){
for(int i=x;i>=0;i--){
a[1] = i;
dfs(x-i,step+1);
a[1] = 0;
}
}else if(step == 2){
for(int i=x/2;i>=0;i--){
a[2] = i;
dfs(x-i*2,step+1);
a[2] = 0;
}
}else if(step == 3){
for(int i=x/5;i>=0;i--){
a[3] = i;
dfs(x-i*5,step+1);
a[3] = 0;
}
}
}
}
int main(){
int n;
cin>>n;
dfs(n,1);
}