| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 604 人关注过本帖
标题:钱兑换的加强版,求吧友一起探讨
只看楼主 加入收藏
叶舞秋风
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2014-5-29
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
钱兑换的加强版,求吧友一起探讨
题目:将10元钱兑换成1元,5角,1角的硬币,共40枚,计算有多少种兑换方法。并且求出最小枚数的组合,和最大枚数的组合。

#include<stdio.h>
void main()
{
    int x,y,z,j=0,a[5],min,max=0;
        for(x=0;x<=10;x++)
        for(y=0;y<=20;y++)
        {z=40-x-y;
        if(10*x+5*y+z==100)
        {
            j=j+1;
            a[j]=x+y+z;
            min=a[1];
            printf("di %d zhong fangfa:1 yuan%dmei,5jiao%dmei,1jiao%dmei\n",j,x,y,z);
        }
        }
        if(a[j]<min)
            min=a[j];
                if(a[j]>max)
                  max=a[j]
        printf("gong you%d zhong ruihuan fanfang\n",j);
        printf("zui xiao/da de zuhe fangfa si wei:%d,&d,x=%d,y=%d,z=%d",min,max,x,y,z);
}
#include<stdio.h>
void main()
{
    int x,y,z,j=0,a[5],min;
        for(x=0;x<=10;x++)
        for(y=0;y<=20;y++)
        {z=40-x-y;
        if(10*x+5*y+z==100)
        {
            j=j+1;
            a[j]=x+y+z;
            min=a[1];
            printf("di %d zhong fangfa:1 yuan%dmei,5jiao%dmei,1jiao%dmei\n",j,x,y,z);
        }
        }
        if(a[j]<min)
            min=a[j];
        printf("gong you%d zhong ruihuan fanfang\n",j);
        printf("zui xiao de zuhe fangfa si wei:%d,x=%d,y=%d,z=%d",min,x,y,z);
}
我这代码有错误,求指出.

[ 本帖最后由 叶舞秋风 于 2014-7-19 10:59 编辑 ]
搜索更多相关主题的帖子: include zhong 
2014-07-19 10:56
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
程序代码:
#include<stdio.h>
void main()
{
    int x,y,z,j=0,a[5],min,max=0;    //你如何知道不会超过5种组合?定义的数组未免小了点.
        for(x=0;x<=10;x++)
        for(y=0;y<=20;y++)
        {z=40-x-y;
        if(10*x+5*y+z==100)
        {
            j=j+1;
            a[j]=x+y+z;
            min=a[1];
            printf("di %d zhong fangfa:1 yuan%dmei,5jiao%dmei,1jiao%dmei\n",j,x,y,z);
        }
        }                     //两个for循环都是在此处结束的,x,y,z三个变量保留的是此时的值.
        if(a[j]<min)
            min=a[j];
                if(a[j]>max)
                  max=a[j]
        printf("gong you%d zhong ruihuan fanfang\n",j);
        printf("zui xiao/da de zuhe fangfa si wei:%d,&d,x=%d,y=%d,z=%d",min,max,x,y,z); //接上一跳注释,x,y,z的值你没法判断是最大的还是最小的,况且这里输出
                                                                                        //后只有一种x,y,z的组合,是最大还是最小,恐怕你自己都不知道.
}

第二个你犯的是同样的错误. 尽管你得到了a[j]的值,也比较了min和a[j]的值,但a[j]对应xyz并没有保存,你得到的a[j]与最后的xyz并不对应.

代码测试环境:  WinXP+C-Free5.0.
2014-07-19 14:18
叶舞秋风
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2014-5-29
收藏
得分:0 
回复 2 楼 vvvcuu
大神,你帮我改过来啊,这说的我有点蒙。
2014-07-21 08:58
叶舞秋风
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2014-5-29
收藏
得分:0 
回复 2 楼 vvvcuu
要怎么保存它的值,你别只纸上谈兵啊
2014-07-21 09:05
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
整个二维数组,大点的,比如说zuzhe[10000][4],前面的指标代表每种组合的序数,后面的的指标第一个代表总的枚数,第二个代表1元的枚数,第三个代表五角的枚数,第四个的代表一角的枚数.每次计算后就存起来.
然后进行比较zuhe[x][0], 最小的就是最少枚数组合,最大的就是最多枚数的组合, 当然这里面可能会有重复.

既然给你指出错误来了,你应该自己思考一下该如何去改.  我给你改过来,你如果不明白思路(算法)的话,恐怕代码也看着费劲. 自己思考一下,把算法用伪代码写出来,然后转换成C代码就可以了.出现错误,或者有不明白的,把代码发上来再问.

代码测试环境:  WinXP+C-Free5.0.
2014-07-22 11:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
数组没必要开那么大。满足条件的兑换方法不会超过 11x21= 231 种,这也是个很粗糙的估算。实际只有60种。

送段代码吧

程序代码:
#include <stdio.h>

int Coin[] = {1, 5, 10};
int Combs[200][3];
int Count;

void cal(int cash, int coins, int coin_types)
{
    static int comb[3];
    int i, t;

    if(coin_types == 0)
        if(cash > coins * Coin[0]) return;
        else if(cash % Coin[0]) return;
        else
        {
            comb[0] = cash / Coin[0];
            for(i = 0; i < 3; i++) Combs[Count][i] = comb[i];
            Count++;
            return;
        }

    t = cash / Coin[coin_types];
    if(t > coins) t = coins;
    for(i = 0; i <= t; i++)
    {
        comb[coin_types] = i;
        cal(cash - i * Coin[coin_types], coins - i, coin_types - 1);
    }
}

void search(int cash, int coins)
{
    Count = 0;
    cal(cash, coins, 2);
}

int main()
{
    int i;
    search(100, 40);
    printf("count is %d\n", Count);
    for(i = 0; i < Count; i++)
        printf("[%d] %4d %4d %4d\n", i, Combs[i][0], Combs[i][1], Combs[i][2]);
    return 0;
}

重剑无锋,大巧不工
2014-07-22 15:18
waja
Rank: 2
等 级:论坛游民
帖 子:53
专家分:52
注 册:2012-7-27
收藏
得分:0 
#include "stdio.h"

int g_iYuan = 0;
int g_iJiao = 0 ;
int g_iFen = 0;
 
void main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 0; i <= 10 ; i++, g_iYuan = i )
    {
        for (j = 0; j <= 40 - i  ; j++, g_iJiao = j)
        {
            for (k = 0; k <= (40 - i - j); k++, g_iFen = k)
            {
                if (1000 == g_iYuan * 100 + g_iJiao * 50 + g_iFen * 10 )
                {
                    printf("%d Yuan -----%d  WuJiao -----%d YiJiao ----共 %d 枚 \n",g_iYuan, g_iJiao, g_iFen, i+j+k );
               
                }

            }
        }
    }
}
2014-08-07 22:38
快速回复:钱兑换的加强版,求吧友一起探讨
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024300 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved