总时间限制: 1000ms 内存限制: 65536kB
描述
使用1角、2角、5角硬币组成 n 角钱。
设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。
输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入
一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出
输出有若干行,每行的形式为:
i a b c
第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例输入
10
1
样例输出
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
分析:
这题有一部分人不会做,是因为不知道该用什么算法,其实这题很简单,这道题的算法其实是最简单的 枚举 ,没错就是枚举。(OS:这题是真简单)
简单是简单,但这题枚举的顺序不能错,先要从5角开始枚举,然后是2角,最后是1角,分别对应了:
int x;//变量名随便定
for(int 变量1=0;变量1<=x/5;变量1++)
for(int 变量2=0;变量2<=x/2;变量2++)
for(int 变量3=x;变量3>=0;变量3--)//因为x/1=x,所以可以省略
但还有个难点, 输出 。你们肯定要问输出难在哪?
难在是怎么输出来
001 002
这种数字。
其实很简单,用这句
printf("%03d",变量);
然后就是每个数字固定12个字符宽度。
printf("%12d",变量);
但是枚举出来的面值可能不等于要求的面值,所以要加个IF进行判断;
那代码不就有了。我看谁敢直接抄代码
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,t=0;//t是次数
cin>>n;
for(int i=0;i<=n/5;i++)
for(int j=0;j<=n/2;j++)//从0开始枚举
for(int k=n;k>=0;k--)//1角要倒着输出,可以看下样例
if(i*5+j*2+k==n)//防止枚举出来的与要求的面值不符
printf("%03d%12d%12d%12d\n",++t,k,j,i);//注意输出格式,别忘了换行
return 0;
}
我翻了下这道题,洛谷没有,所以不能在洛谷上验证,但这并不影响
但还是希望能对你有用!!!