toj2273 Making Change

来源:互联网 发布:php ll 和 优先级 编辑:程序博客网 时间:2024/05/17 23:14

题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=2273

题目大意:四种面值 25 10 5 1 并给定各个面值的数目 和钱的总数,问把钱兑换成上述各种面值的硬币所需的最少硬币数量。

思路:DFS,分4层,每层逐个放入硬币后,递归到下一层,当递归到最后一层时,判断能否完成兑换,若能完成 就把硬币数量的最小值替换掉

代码:

#include <iostream>
using namespace std;
int m[5],cnt,res[5],num[5],C,MIN;
int c[]={25,10,5,1};
void dfs(int d)
{
     int i,sum,n;
     if(d>3)
     {
       for(i=sum=n=0;i<4;i++)  //n为硬币总数量 sum为钱的总数
       {
         sum+=c[i]*num[i];
         n+=num[i];
       }
       if(sum==C)
       {
          if(n<MIN)
          {
            for(i=0;i<4;i++)
            res[i] = num[i];  //res 各种硬币数量
            MIN = n;          //最小硬币数量
          }
          cnt++;              //分配方法个数
       }
     }
     else
     {
         for(i=0;i<=m[d];i++)
         {
            num[d] = i;
            dfs(d+1);
         }

     }         
}

int main()
{
    while(cin>>m[0]>>m[1]>>m[2]>>m[3]>>C && m[0]||m[1]||m[2]||m[3]||C)
    {
      MIN = m[0]+m[1]+m[2]+m[3]+1;
      cnt = 0;
      dfs(0);
      if(cnt==0)
      cout<<"Cannot dispense the desired amount."<<endl;
      else
      cout<<"Dispense "<<res[0]<<" quarters, "<<res[1]<<" dimes, "<<res[2]<<" nickels, and "<<res[3]<<" pennies."<<endl;
    }
    return 0;
}