| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1969 人关注过本帖
标题:谁能解决:找零钱的问题
只看楼主 加入收藏
xiaodong5800
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-3-5
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
谁能解决:找零钱的问题
我们知道人民币有1、2、5、10、20、50、100这几种面值。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入有多组,每组一行,为一个整合n。
输入以0结束。
输出该面额有几种表示方法。

搜索更多相关主题的帖子: 人民币 
2010-03-06 20:40
chengwen1016
Rank: 2
等 级:论坛游民
帖 子:14
专家分:60
注 册:2010-3-6
收藏
得分:5 
枚举的,不知道速度符不符合楼主要求。
#include <iostream>
using namespace std;

long int count(int n)
{
    long int sum = 0;
    int i, j, k, p, q, r, s;
    for (i = 0; i <= n/100; i++)
        for (j = 0; j <= n/50; j++)
            for (k = 0; k <= n/20; k++)
                for (p = 0; p <= n/10; p++)
                    for (q = 0; q <= n/5; q++)
                        for (r = 0; r <= n/2; r++)
                            for (s = 0; s <= n; s++)
                            {
                                if (100*i + 50*j + 20*k + 10*p + 5*q + 2*r + s == n)
                                    sum++;
                            }
    return sum;
}

int main()
{
    int n;
    cin >> n;
    while (n != 0)
    {
        cout << "Total = " << count(n) << endl;
        cin >> n;
    }
    return 0;
}
2010-03-07 19:57
寻找南方
Rank: 2
等 级:论坛游民
帖 子:57
专家分:75
注 册:2009-10-21
收藏
得分:2 
看你的思路和程序都很好,但为什么你的程序我复制到VC++6.0中执行的没效果啊!!是不是你的空格太多了!

我一路向前~~~~~~~~~~~~~
2010-03-08 02:05
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:13 
应该还有更好的方法(上面的改了下)
#include <iostream>
using namespace std;

void count(int n)
{
    int sum=0;
    int i, j, k, p, q, r, s;
    for (i = 0; i <= n/100; i++)
        for (j = 0; j <= n/50; j++)
            for (k = 0; k <= n/20; k++)
                for (p = 0; p <= n/10; p++)
                    for (q = 0; q <= n/5; q++)
                        for (r = 0; r <= n/2; r++)
                        {
                            s=n-(100*i + 50*j + 20*k + 10*p + 5*q + 2*r);
                            if  (s>=0&&i+j+k+p+q+s<=100)
                            {
                                printf("100:%d  50:%d  20:%d  10:%d  5:%d  2:%d  1:%d\n",i,j,k,p,q,r,s);
                                sum++;
                            }
                        }
                        cout<<"共有"<<sum<<"种方法!"<<endl;
}

int main()
{
    int n;
    cin >> n;
    while (n != 0)
    {
        count(n);
        cin >> n;
    }
    return 0;
}

★★★★★为人民服务★★★★★
2010-03-08 08:16
chengwen1016
Rank: 2
等 级:论坛游民
帖 子:14
专家分:60
注 册:2010-3-6
收藏
得分:0 
回复 3楼 寻找南方
程序能否执行和空格的多少没关系的。我用的也是 VC++6.0 可以的,看一下是不是别的问题。

想出了一个更好的办法,用dp做的。时间复杂度很低了,完全符合楼主要求。

代码如下:

#include <iostream>
using namespace std;

int money[8] = { 0, 1, 2, 5, 10, 20, 50, 100 };
long int dp[8][251];

int main()
{
    int i, j, n;
    for (i = 0; i < 8; i++)  
    {
        dp[i][0] = 1;
        dp[i][1] = 1;
    }
    for (i = 0; i < 251; i++)
    {
        dp[0][i] = 1;
        dp[1][i] = 1;
    }
    for (i = 2; i < 8; i++)
    {
        for (j = 2; j < 251; j++)
        {
            if (j - money[i] >= 0) dp[i][j] = dp[i][j-money[i]] + dp[i-1][j];
            else                   dp[i][j] = dp[i-1][j];         
        }
    }

    while (cin >> n && n != 0)
    {
        cout << "Total = " << dp[7][n] << endl;
    }
    return 0;
}
2010-03-08 19:21
快速回复:谁能解决:找零钱的问题
数据加载中...
 
   



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

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