找零钱问题

原创 2015年07月06日 22:52:21

我们知道人民币有1、2、5、10、20、50、100这几种面值。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入

输入有多组,每组一行,为一个整合n。
输入以0结束。

#include<stdio.h>

#include<stdlib.h>
#include<stdio.h>
#define min(a, b) ((a)<(b)?(a):(b))
int main()
{
    int f[251] = {0}, a[] = {1, 2, 5, 10, 20, 50, 100}, i, j, k;
//f[i]表示金额i共有几种表示方法
    for(i = 0; i < 7; i++)
for(j = min(a[i] * 100, 250); j >= a[i]; j--)
{ //以下代码表示从金额为j开始(依次递减),每个金额相对面币i(一次重复放多张)的可能性有多少种
if(j % a[i] == 0) f[j]++;
for(k = j - a[i]; k > 0; k -= a[i])
 f[j] += f[k];//面值j再减去多张面币i后 还要累加以前的面值为k的种类
}

//f[k]表示a[i]以下的元素组合成k的个数
//例如:当i=1时,a[1]=2,在只有一个2时,剩下的198由i<1的元素组合,当有两个2时,剩下的196也由i<1的元素组合,以此类推;
//f[k]表示a的下标在i以下的元素组合成k的个数;
    for(; scanf("%d", &i), i; printf("%d\n", f[i]));
    return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<stdio.h>
#define M    250
#define N    100
int main()
{
    int f[M + 1][N + 1] = {0};
    int a[] = {1, 2, 5, 10, 20, 50, 100};
    int i, j, k;
    
    for(i = 0; i < 7; i++){
j = a[i];
for(f[j][1] = 1; j <= M; j++)
for(k = 2; k <= N; k++)
 f[j][k] += f[j - a[i]][k - 1];
}


    for(i = 1; i <= M; i++)
    for(j = 1; j <= N; j++)
        f[i][0] += f[i][j];
    
    while(scanf("%d", &i), i) printf("%d\n", f[i][0]);
    
    return 0;

}


//这是自己写的找零钱程序(递归方法)但是只能找200以下的,200以上的会出错,可能是因为占空间不足吧

/*#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
int get_money(int a[],int k,int t,int money){
int i,j;
int s=0;
if(a[k]*t<money){
s += get_money(a,k+1,t,money-t*a[k]);
for(j=1;(money-t*a[k]+(j*a[k]+money%a[k]))<=money;j++){
s += get_money(a,k+1,t,money-t*a[k]+(j*a[k]+money%a[k]));
}
}
else{
if(money%a[k]==0){ s++;}
else if(2*a[k]>money) return 0;
for(j=1;(j*a[k]+money%a[k])<=money;j++){
s += get_money(a,k+1,t,j*a[k]+money%a[k]);
}
}
return s;
}
void main(){
int a[]={1,2,5,10,20,50,100};
int money = 199,i,s;
s = get_money(a,0,100,money);
printf("%d",s);
getchar();
}

//这个程序也是自己写的,但是这个程序没有纸币限制在100张
#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
int get_money(int a[],int k,int money){
int i,j;
int s=0;
if(money%a[k]==0){ s++;}
else if(2*a[k]>money) return 0;
for(j=1;(j*a[k]+money%a[k])<=money;j++){
s += get_money(a,k+1,j*a[k]+money%a[k]);
}
return s;
}
void main(){
int a[]={1,2,5,10,20,50,100};
int money = 250,i,s;
s = get_money(a,0,money);
printf("%d",s);
getchar();
}

//以下程序是别人的,不过也没有100张的限制
#include <iostream>  
#include <string>  
using namespace std;  
#define MAX_VALUE   50  
int nexta[20]={0};
int array[] = {1,2,5,10,20,MAX_VALUE};     
int ss = 1;
void SegNum(int nSum, int* pData, int nDepth)  
{  
   
if(nSum < 0)  
        return;  
  
    if(nSum == 0)  
    {  
        for(int j = 0; j < nDepth; j++) 
cout << pData[j] << " "; 
     
cout <<"ss:"<<ss<< endl; 
ss++;
       
        return;  
    }  
  
    int i = (nDepth == 0 ? nexta[0] : pData[nDepth-1]);  
    for(; i <= nSum;)  
    {  
        pData[nDepth++] = i;  
        SegNum(nSum-i,pData,nDepth);  
        nDepth--;  
  
        i = nexta[i];  
    }  
}  
  
void ShowResult(int array[],int nLen)  
{  
    nexta[0] = array[0];  
    int i = 0;  
    for(; i < nLen-1; i++)  
        nexta[array[i]] = array[i+1];  
    nexta[array[i]] = array[i]+1;  
  
    int* pData = new int [MAX_VALUE];  
    SegNum(MAX_VALUE,pData,0);  
    delete [] pData;  
}  
int main()  
{  
    ShowResult(array,sizeof(array)/sizeof(int));  
    system("pause");  
    return 0;  
} */ 

这个程序的结果如下图:


[OJ]找零钱

题目:我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1...

【找零钱问题】

这是一道比较有意思的题,在牛客网网直通BAT算法的题中看到。 这里坐下记录: 题:我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n元,让你计算换成用上面这些面额表示且总数...

c语言求硬币找零钱问题

  • 2009年09月13日 23:28
  • 676B
  • 下载

动态规划系列(2)——找零钱问题

用动态规划算法来实现找零钱问题的求解。
  • dnxbjyj
  • dnxbjyj
  • 2017年04月18日 01:09
  • 534

贪心算法解决找零钱问题

   #include #include using namespace std; int arr[] = {100, 20, 10, 5, 1}; //零钱的种类 int N = siz...

找零钱类组合问题思路小结

思路: 1、这类问题的思路采用递归的思想的思考方式如下: 1> 对于某个数 X 能够由 A1、A2、A3的组合构成的问题,假设 f(x) 表示组合的个数。那么,...

动态规划1:找零钱练问题

动态规划1:找零钱练问题

C++小练习—找零钱问题

采用贪心算法解决找零钱问题,如果需要找零57.8元,零钱数分别为(10元、5元、1元、5角、2角、1角 ) 1、采用元为单位编写程序如下所示: 得到的输出结果为: 正如红色标记所标示的地方出现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:找零钱问题
举报原因:
原因补充:

(最多只允许输入30个字)