标题:最少硬币数 代码 求注释
只看楼主
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
结帖率:83.33%
已结贴  问题点数:2 回复次数:3 
最少硬币数 代码 求注释
#include<iostream>  
using namespace std;  
  
int V[20];  
int n, S;   
int minv[200],maxv[200];  
int d[200]={0},vis[200] = {0};  
  
int min(int x, int y)  
{  
    return x < y ? x : y;  
}  
  
int dp(int S)  
{   
    if(S == 0) return 0;  
    if(vis[S]) return d[S];  
    int &ans = d[S];  
    ans = (1<<30);  
    for(int i = 0; i < n; i++)  
        if(S >= V[i])   
            ans = min(ans, dp(S - V[i]) + 1);  
    return ans;  
}  
  
void print_ans(int *d, int S){  
    for(int i = 0; i < n; i++)  
        if(S >= V[i] && d[S] == d[S - V[i]] + 1){  
            cout << V[i] << ' ';  
            print_ans(d, S - V[i]);  
            break;  
        }  
}  
  
int main()  
{  
    minv[0] = maxv[0] = 0;  
    cout << "输入硬币种数:";   
    cin >> n;  
    cout << "依次输入其面值:" << endl;  
    for(int i = 0; i < n; i++)  
        cin >> V[i];  
    cout << "输入要凑的总面值:";  
    cin >> S;  
    cout << "最少需要的硬币数为:" << dp(S) << endl << "它们分别是:";  
    print_ans(d, S);  
    return 0;   
}  
搜索更多相关主题的帖子: 注释 int return i++ cout 
2018-03-07 19:16
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
得分:0 
你发错区了吧,这个是c++
2018-03-07 20:09
学跑步的少年
Rank: 1
等 级:新手上路
帖 子:39
专家分:5
注 册:2018-3-6
得分:0 
回复 楼主 学跑步的少年
。。有c语言的代码没,。大佬。
2018-03-07 20:25
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
得分:2 
#include<iostream>  
using namespace std;  
  
int V[20];  
int n, S;   
int minv[200],maxv[200];  
int d[200]={0},vis[200] = {0};  

  
int min(int x, int y)  
{  
    return x < y ? x : y;  //三目运算表达式。如果x<y成立,就返回x。如果x<y不成立,返回y。
}  
  
int dp(int S)  
{   
    if(S == 0) return 0;  //如果s为0,返回0
    if(vis[S]) return d[S];  //如果vis[S]不为0,返回d[s]
    int &ans = d[S];  //创建d[s]的引用ans
    ans = (1<<30);  //把1左移30位(也就是1*2^30),结果赋给ans,因为是d[S]的引用,所以d[S]的值也跟着改变了.
    for(int i = 0; i < n; i++)  //下面是对总面值S和V数组的元素进行比较大小。
        if(S >= V[i])   
            ans = min(ans, dp(S - V[i]) + 1);  
    return ans;  
}  
  
void print_ans(int *d, int S)//打印功能
{  
    for(int i = 0; i < n; i++)  
        if(S >= V[i] && d[S] == d[S - V[i]] + 1){  
            cout << V[i] << ' ';  
            print_ans(d, S - V[i]);//递归调用  
            break;  
        }  
}  
  
int main()  
{  
    minv[0] = maxv[0] = 0;  
    cout << "输入硬币种数:";   
    cin >> n;  
    cout << "依次输入其面值:" << endl;  
    for(int i = 0; i < n; i++)  
        cin >> V[i];  
    cout << "输入要凑的总面值:";  
    cin >> S;  
    cout << "最少需要的硬币数为:" << dp(S) << endl << "它们分别是:";  
    print_ans(d, S);  
    return 0;   
}

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-07 22:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485072-1-1.html




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

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