标题:找零钱·
只看楼主
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
结帖率:100%
已结贴  问题点数:20 回复次数:7 
找零钱·
描述
我们知道人民币有1、2、5、10、20、50、100这几种面值。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入
输入有多组,每组一行,为一个整合n。
输入以0结束。
输出
输出该面额有几种表示方法。
样例输入
1
4
0
样例输出
1
3
提示
如果我告诉你,这题是用暴力穷举的方法,你能通过吗?^_^
题目链接:http://acm.tzc.
我自己的代码
程序代码:
#include"stdio.h"
int f2(int n)
{
    return n/2+1;
}
int f5(int n)
{
    int su,i;
    for(i=0,su=0;i*5<=n;i++)
    su+=f2(n-i*5);
    return su;
}
int f10(int n)
{
    int i,su;
    for(i=0,su=0;i*10<=n;i++)
    su+=f5(n-i*10);
    return su;
}
int f20(int n)
{
    int i,su;
    for(i=0,su=0;i*20<=n;i++)
    su+=f10(n-i*20);
    return su;
}
int f50(int n)
{
    int i,su;
    for(i=0,su=0;i*50<=n;i++)
    su+=f20(n-i*50);
    return su;
}
int f100(int n)
{
    int i,su;
    for(i=0,su=0;i*50<=n;i++)
    su+=f50(n-i*100);
    return su;
}
int main()
{
    int i,n,su,s;
    while(scanf("%d",&n),n)
    {
        s=1*(n<5)+2*(n>=5&&n<10)+3*(n>=10&&n<20)+4*(n>=20&&n<50)+5*(n>=50&&n<100)+6*(n>=100);
        switch(s)
        {
            case 1:su=f2(n);break;
            case 2:su=f5(n);break;
            case 3:su=f10(n);break;
            case 4:su=f20(n);break;
            case 5:su=f50(n);break;
            case 6:su=f100(n);break;
        }
        printf("%d\n",su);
    }
    return 0;
}

思路就是穷举
我给的输入
5
4
10
11
我认为前10个我没有错
但他说的答案错。。。。求大神解释
搜索更多相关主题的帖子: 人民币 暴力 
2013-04-23 19:25
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
得分:0 
这帖就沉了?是题目太无聊了。还是太麻烦了?
2013-04-25 08:10
子楠
Rank: 3Rank: 3
来 自:武汉
等 级:论坛游侠
帖 子:111
专家分:164
注 册:2013-4-9
得分:0 
额,想了想,求给个简单一点的思路
2013-04-25 09:00
yuyilahanbao
Rank: 2
等 级:论坛游民
帖 子:25
专家分:19
注 册:2013-2-16
得分:0 
以下主要为枚举过程,没有读入输出等
这如果只是一个测试数据勉强能过,但从输入样例可以看到有很多个
但枚举过程可以大大优化,明天我在告诉你优化
int main()
{int er,wu,shi,ers,wus,yibai,qian;
long daan;
daan=0;
for (yibai=0;yibai<3;yibai++)  //一百最多2张
  for (wus=0;wus<6;wus++)  //五十最多5张
    for (ers=0;ers<13;ers++)  //二十最多12张
      for (shi=0;shi<26;shi++)  //十元最多25张
       for (wu=0;wu<51;wu++)//五元最多50张
         for (er=0;er<101;er++)  //二元最多100张
if(((qian-yibai*100-wus*50-ers*20-shi*10-wu*5-er*2)>=0)&&(yibai+wus+ers+shi+wu+er+(qian-yibai*100-wus*50-ers*20-shi*10-wu*5-er*2)<100)) daan++;
}
2013-04-25 12:33
yuyilahanbao
Rank: 2
等 级:论坛游民
帖 子:25
专家分:19
注 册:2013-2-16
得分:0 
照你这样说是测试数据有问题。你是如何知道他说你错了?
2013-04-25 19:00
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
得分:0 
回复 5楼 yuyilahanbao
这是一个ACM题目
有在线评测系统
我把题目发上去
它给我的回复
是错误答案
就是说我写的错的
2013-04-25 20:53
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:0 
回复 6楼 Magic_July
你穷举的话,可以事先根据实际情况进行判断,进一步缩小范围

Maybe
2013-04-25 21:32
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
得分:20 
程序代码:
#include <iostream>
using namespace std;

int a[7]={1,2,5,10,20,50,100};
int f[251][101],n;

int main()
{
    f[0][0]=1;
    for (int i=0; i<7; i++)
        for (int j=a[i]; j<=250; j++)
            for (int k=1; k<=100; k++)
                f[j][k]+=f[j-a[i]][k-1];
    
    for (int i=1; i<=250; i++)
        for (int j=1; j<=100; j++) f[i][0]+=f[i][j];
        
    while (cin>>n,n!=0) cout<<f[n][0]<<endl;
}
            


提交试下,动态规划,f[i][j]表示i用j张零钱表示有多少种方法
2013-04-25 22:34



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




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

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