Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2857232
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-01 21:01:09

Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent.
有5种硬币,每种无限的,那么给定一个数,有多少种兑换方法呢?下一篇每种硬币不超过100个
 
 
 
 
 
 
 
 
 
 
 

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. /*
  3. //c1是用来存放展开式的系数的,而c2则是用来计算时保存的,
  4. //他是用下标来控制每一项的位置,比如 c2[3] 就是 x^3 的系数。
  5. //用c1保存,然后在计算时用c2来保存变化的值。
  6. */

  7. const int max=250;
  8. int c1[max+1],c2[max+1];
  9. int main()
  10. {

  11.     int n,i,j,k;
  12.     int deta[]={1,5,10,25,50};
  13.     while(scanf("%d",&n)!=EOF)
  14.     {
  15.         // 计算的方法还是模拟手动运算,一个括号一个括号的计算,
  16.         // 从前往后
  17.         //对于 1+x+x^2+x^3+ 他们所有的系数都是 1
  18.         // 而 c2全部被初始化为0是因为以后要用到 c2[i] += x ;
  19.         for(i=0;i<=n;i++)
  20.         {
  21.             c1[i]=1;
  22.             c2[i]=0;
  23.         }

  24.         //第一层循环是一共有 n 个小括号,而刚才已经算过一个了
  25.         //所以是从2 到 5

  26.         for(i=2;i<=5;i++)
  27.         {
  28.             for(j=0;j<=n;j++)
  29.             {
  30.                 for(k=0;k+j<=n;k+=deta[i-1])
  31.                 {
  32.                     c2[k+j]+=c1[j];
  33.                 }
  34.             }
  35.             for(j=0;j<=n;j++)
  36.             {
  37.                 c1[j]=c2[j];
  38.                 c2[j]=0;
  39.             }
  40.         }
  41.        printf("%d\n",c1[n]);
  42.     }

  43.     return 0;

  44. }

 
 
阅读(755) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~