23年5月 全国青少年C语言等级考试三级-硬币面值组合

该篇文章介绍了如何通过递归方法解决一个编程题目,即使用1角、2角和5角硬币组成n角钱的所有可能组合,按照5角硬币数量从小到大,再按2角硬币数量排序。作者给出了C++代码实现和样例输入输出说明。
摘要由CSDN通过智能技术生成

题目:硬币面值组合

【题目描述】

        

使用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);
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值