换硬币,人民币等多种思路方法(以谁作为输出结果的排列依据就以谁作为外层for)

将一笔零钱换成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

(1)暴力枚举

#include
int main()
{
    int fen5=0,fen2=0,fen1=0;
    int x,total=3,count=0;
    scanf("%d",&x);
    for(fen5=x/5;fen5>0;fen5--)
    {
        for(fen2=x/2;fen2>0;fen2--)
        {
            fen1=x-5*fen5-2*fen2;//5和2分过多会超出x的金额所以还要判断fen1是否大于零
            
                if(fen1>0&&fen1+fen2*2+fen5*5==x)
                {
                     count++;
                     
                     printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, fen1+fen2+fen5);
                }
            
        }
    }
    printf("count = %d",count);
}

(2)依据题目要求每种硬币至少有一个,用数学逻辑将其中俩种硬币设为一个,计算出另一个最多有多少个通过for循坏计算,但输出结果是对称的

#include
int main()
{
    int fen5, fen2, fen1, total=3, count=0, x;
    scanf("%d", &x);
    for (int fen5 = 1; fen5 < 20; fen5++)
    {
        //fen2=93-fen5-
        for (int fen2 = 1; fen2 <= 47; fen2++)
        {
            for (fen1 = 1; fen1 <= 93; fen1++)
            {
                if (x == 5 * fen5 + 2 * fen2 + fen1)
                {
                    count++;
                    total = fen5 + fen2 + fen1;
                    printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, total);
                }
            }
        }
    }
    printf("count = %d", count);
    return 0;
}

输出结果:

fen5:1, fen2:1, fen1:6, total:8
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:3, fen1:2, total:6
fen5:2, fen2:1, fen1:1, total:4
count = 4

1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,会有很多种兑换方案。请编写程序给出各种兑换方案。

输入格式:

输入为一个正整数n,表示要求输出前n种可能的方案。方案的顺序,是按照5分硬币从少到多排列的。

输出格式:

显示前n种方案中5分、2分、1分硬币各多少枚。每行显示一种方案,数字之间空一格,最后一个数字后没有空格。

注意:如果全部方案不到n种,就顺序输出全部可能的方案。

输入样例:

5

输出样例:

1 46 53  
2 42 56  
3 38 59  
4 34 62  
5 30 65

 

#include
int main()
{
    int fen5=1,fen2=1,fen1=1;
    //fen5*5+fen2*2+fen1==150前俩个是
    //fen5+fen2+fen1=100
    //fen5*4+fen2=50
    int i,j,k,n;
    int count=0;
    scanf("%d",&n);
    for(fen5=1;fen5<13;fen5++)
    {
        fen2=50-4*fen5;
        fen1=100-fen2-fen5;
        if(fen5*5+fen2*2+fen1==150)
        {
            count++;
            if(count<=n)
            {
                printf("%d %d %d\n",fen5,fen2,fen1);
            }
        }
     }
    return 0;
}

你可能感兴趣的:(算法,c++,开发语言)