动态归化 找零钱

来源:互联网 发布:w7本机ip端口查询器 编辑:程序博客网 时间:2024/04/29 06:25

/*动态规划  找零钱
10月18,2006
版本1
薛向旭
//算法意思为:要用最低j个面值找好i的钱,那么分为两种情况,1:只用j-1个面值 2 至少用一个第j面值,
在这两种情况中取一个小的,而这两种情况都有一个参数比要求的表达式的参数小。所以可以递推出来。
我认为算法的核心是:确认上一步的成果,并利用之。

*/
#include <iostream>
using namespace std;
#define INF 999999
int num =3;
int N=100;
int d[4]={0,1,4,6};
int c[101][4];               //c[j][i]  ,j表示要找的面值, i表示用到的货币数量(从小往大数) c[j][0]==INF可以让算法更明了
int FIR[101][4][4];       //FIR[i][j][k]  i零钱数量  j表示用到的货币数量(从小往大数) k每张面值需要几张
int min(int a, int b)
{
 if( a < b)
  return a;
 return b;
}
void test1()
{
    memset(c,INF,sizeof(c));
 memset(FIR,0,sizeof(FIR));
 c[1][1] =1;
 c[1][2] =1;
    c[1][3] = 1;
 FIR[1][1][1] = 1;
    FIR[1][2][1] = 1;
 FIR[1][3][1] = 1;
 c[2][1] =2;
 c[2][2] =2;
 c[2][3] =2;
    FIR[2][1][1] =2;
    FIR[2][2][1] =2;
 FIR[2][3][1] =2;

 c[3][1] =3;
 c[3][2] =3;
    c[3][3] =3;
    FIR[3][1][1] =3;
    FIR[3][2][1] =3;
 FIR[3][3][1] =3;

    c[4][1] =4;
    c[4][2] =1;
 c[4][3] =1;
    FIR[4][1][1] =4;
    FIR[4][2][2] =1;
 FIR[4][3][2] =1;
 
 c[5][1]=5;
 c[5][2] =2;
 c[5][3] =2;
    FIR[5][1][1] =5;
    FIR[5][2][1] =1;
 FIR[5][2][2] = 1;
 FIR[5][3][1] =1;
 FIR[5][3][2] = 1;

    c[6][1] =6;
 c[6][2] =3;
 c[6][3] =1;
    FIR[6][1][1] =6;
    FIR[6][2][1] =2;
 FIR[6][2][2] =1;
 FIR[6][3][3] =1; 
 int i=7;
 int j,k;
 while(i<=100)   //如何不用最大面值?  tmp == c[i-1,j]
 {
  for(j=1;j<=3;j++)
  {
             c[i][j] = min( c[ i-d[j] ] [j] +1, c[i][ j-1] );
             if(  c[ i-d[j] ] [j] +1 < c[i][ j-1])  //1 用一张面值j
    {
                for(k=1;k<=3;k++)
    {
      FIR[i] [j][k] =   FIR[ i-d[j] ] [j] [k];
    }
    FIR[i] [j][j]++;
    }
    else
    {
                for(k=1;k<=3;k++)
    {
      FIR[i] [j][k] =   FIR[ i ] [j-1] [k];
    }
    }
        
                 
  }
  i++;
 }
}
void test2()
{
         memset(c,0,sizeof(c));

}
int main()
{
 test1();
 cout<<"零钱 :              "<<"d[1]=1   "<<"d[2]=4   "<<"d[3]=6   "<<endl;
 int i=1;
 while(i<=100){
   cout<<i<<"需要总张数:"<<c[i][3]<<" 各自数量: "<<FIR[i][3][1]<<"      "<<FIR[i][3][2]<<"    "<<FIR[i][3][3]<<"    "<<endl;
      i++;
 }
 return 0;
}

原创粉丝点击