| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3109 人关注过本帖, 1 人收藏
标题:最少钱币数, 大佬求帮助 !
只看楼主 加入收藏
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
结帖率:83.33%
收藏(1)
已结贴  问题点数:5 回复次数:17 
最少钱币数, 大佬求帮助 !
最少钱币数
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑 15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
【要求】(代码需加注释)
【数据输入】输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。
【数据输出】每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
【样例输入】
15
6 2 5 10 20 50 100
1
1 2
0
【样例输出】
2
Impossible
搜索更多相关主题的帖子: 给定 输入 测试 一行 输出 
2018-03-08 12:28
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
2018-03-08 14:09
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
程序代码:
#include <stdio.h>
#include<limits.h>
int ans,Ki[10];
void makeraise(int m,int n,int c);
int main(void)
{
    int M,K,i;
    while(scanf("%d",&M)==1&&M>0)
    {
        ans=INT_MAX;
        scanf("%d",&K);
        for(i=0;i<K;++i)
            scanf("%d",&Ki[i]);
        makeraise(M,K,0);    
        if(ans!=INT_MAX)
            printf("%d\n",ans);
        else
            printf("Impossible");
    }
    return 0;
}
void makeraise(int m,int n,int c)
{
    if(n<=0)
        return;        
    if(c<ans&&m==0)
        ans=c;
    if(m>=Ki[n-1])
    {
        makeraise(m-Ki[n-1],n,++c);
        --c;
        makeraise(m,--n,c);
        ++n;
    }
    else
        if(m>0)
        {
            makeraise(m,--n,c);
            ++n;
        }
    return;
}


[此贴子已经被作者于2018-3-8 17:47编辑过]

2018-03-08 17:35
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 3楼 李晨经纪人
代码运行结果是这个
图片附件: 游客没有浏览图片的权限,请 登录注册
  怎样解决????
2018-03-08 19:27
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 4楼 学跑步的少年
我这运行正常
图片附件: 游客没有浏览图片的权限,请 登录注册
2018-03-08 20:02
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 5楼 李晨经纪人
我自己敲代码或是复制你写的代码  结果都是我那个结果,这是什么原因造成的???
2018-03-08 20:31
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 6楼 学跑步的少年
能编译通过,至少程序确定在跑了。那至少scanf这些函数能用,你输入数据试试啊
2018-03-08 21:45
莱布尼茨
Rank: 2
等 级:论坛游民
威 望:1
帖 子:8
专家分:19
注 册:2018-3-8
收藏
得分:0 
回复 3楼 李晨经纪人
版主大哥,看了你的代码之后,有几个疑问。
第一个就是能否把INT_MAX换成-1?感觉会方便点。。
第二个就是我输入数据后的结果好像和你的不太一样
第三个就是makeraise函数里的递归,没看懂。。
图片附件: 游客没有浏览图片的权限,请 登录注册

2018-03-08 22:51
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
第一个,不行,这里是求最少的组合,-1为负数,c怎么也不会小于-1。可以换成另一个很大的数。
第二个,你和我结果一样啊。我这里是3组数据和按要求一个0结束程序。你是测试了一组数据。
第三个,这个就有点难解释了,手机打字中。主要就是考虑到使用了最大面值的金币和没有使用最大面值的金币这两个情况
其他就是考虑取值范围和递归终止条件了。睡觉了,我也是菜鸟,没想到还成版主了,诚惶诚恐。打完睡觉。
2018-03-08 23:54
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 9楼 李晨经纪人
大佬,可否给个注释,理解一下,。
2018-03-09 14:34
快速回复:最少钱币数, 大佬求帮助 !
数据加载中...
 
   



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

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