| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3140 人关注过本帖, 1 人收藏
标题:最少钱币数, 大佬求帮助 !
只看楼主 加入收藏
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 9楼 李晨经纪人
大佬,可否给个注释,理解一下,。
2018-03-09 14:37
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 3楼 李晨经纪人
测试下

[此贴子已经被作者于2018-3-9 15:09编辑过]


能编个毛线衣吗?
2018-03-09 15:03
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:5 
程序代码:
//我也是菜鸟,只是按个人的想法写的,也不晓得有没有问题,主要注释了递归的部分
#include <stdio.h>
#include<limits.h>
int ans,Ki[10];                                         //声明两个全局变量ans和Ki,因为他们都会在main中赋值,在makeraise中改变值
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\n");
    }
    return 0;
}
void makeraise(int m,int n,int c)
{
    if(n<=0)                                 //当可选的金币只有0种或小于0种时停止
        return;        
    if(c<ans&&m==0)                          //当钱正好凑齐时,把c赋值给ans
        ans=c;
    if(m>=Ki[n-1])                           //当待凑的钱总数大于等于当前可用最大面值时
    {
        makeraise(m-Ki[n-1],n,++c);          //选择使用当前最大面值金币来凑,计加一步
        --c;                                 //凑钱失败的话加的一步取消,选择下个方式来凑
        makeraise(m,--n,c);                  //不选择当前最大的面值金币,--n表示Ki的最后一个数组元素不要了
        ++n;                                 //如果这个凑钱方法失败,就不取消最大面值金币。(不过如果两个
    }                                        //方法都失败就Impossible了,所以没有++n应该也没关系)
    else
        if(m>0)                              //如果当前待凑的钱总数小于当前最大面值金币但大于0时
        {
            makeraise(m,--n,c);              //用第二大面值的金币来凑钱
            ++n;                             //如果凑钱失败就不取消最大面值金币(和上面一样没有++n应该也没问题)
        }
    return;
}
2018-03-09 18:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个贴不就是完全背包问题嘛,之前记得问过了,用动态dp,如果要取最少组合好像要是把面值从大到小排列才行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-09 18:51
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 13楼 李晨经纪人
非常感谢
2018-03-09 21:04
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 13楼 李晨经纪人
请问代码中 定义的ans在源代码里起到意义??
2018-03-15 17:33
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
收藏
得分:0 
回复 13楼 李晨经纪人
请问代码中 定义的ans在源代码里起到意义??
2018-03-15 17:45
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 17楼 学跑步的少年
用来确定是否有解
2018-03-15 20:38
快速回复:最少钱币数, 大佬求帮助 !
数据加载中...
 
   



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

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