一道算法题-换钱

  题目:给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim代表要找的钱数,求换钱有多少种方法。代码如下:

  

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4 //动态规划
  5 class Exchange {
  6 public:
  7     int countWays(vector<int> penny, int n, int aim) 
  8     {
  9         if(n==0||aim<0)
 10             return 0;
 11         int **map=new int*[n];
 12         for(int i=0;i<n;i++)
 13             map[i]=new int[aim+1];
 14         for(int i=0;i<n;i++)
 15             for(int j=0;j<aim+1;j++)
 16                 map[i][j]=-1;
 17         for(int i=0;i<n;i++)
 18             map[i][0]=1;
 19         for(int i=0;i<aim+1;i++)
 20             if(i%penny[0]==0)
 21                 map[0][i]=1;
 22             else 
 23                 map[0][i]=0;
 24         for(int i=1;i<n;i++)
 25             for(int j=1;j<aim+1;j++)
 26                 if((j-penny[i])>=0)
 27                     map[i][j]=map[i][j-penny[i]]+map[i-1][j];
 28                 else
 29                     map[i][j]=map[i-1][j];
 30         return map[n-1][aim];
 31     }
 32 
 33 };
 34 
 35 
 36 /*记忆搜索
 37 class Exchange {
 38 public:
 39     int countWays(vector<int> penny, int n, int aim) 
 40     {
 41         if(n==0||aim<0)
 42             return 0;
 43         int **map=new int*[n];
 44         for(int i=0;i<n;i++)
 45             map[i]=new int[aim+1];
 46         for(int i=0;i<n;i++)
 47             for(int j=0;j<aim+1;j++)
 48                 map[i][j]=-1;
 49         return process(penny,0,aim,map);
 50 
 51     }
 52     int process(vector<int> arr,int index,int aim,int **map)
 53     {
 54         int res;
 55         if(arr.size()-1==index)
 56         {
 57             if(map[index][aim]==-1)
 58                 map[index][aim]=(aim%arr[index])?0:1;
 59             return map[index][aim];
 60         }
 61         else
 62         {
 63             res=0;
 64             int k=aim/arr[index];
 65             for(int i=0;i<=k;i++)
 66             {
 67                 if(map[index+1][aim-i*arr[index]]==-1)
 68                     map[index+1][aim-i*arr[index]]=process(arr,index+1,aim-i*arr[index],map);
 69                 res+=map[index+1][aim-i*arr[index]];
 70             }
 71         }
 72         return res;
 73     }
 74 };*/
 75 
 76 /*暴力搜索
 77 class Exchange {
 78 public:
 79     int countWays(vector<int> penny, int n, int aim) 
 80     {
 81         if(n==0||aim<0)
 82             return 0;
 83         return process(penny,0,aim);
 84 
 85     }
 86     int process(vector<int> arr,int index,int aim)
 87     {
 88         int res;
 89         if(arr.size()-1==index)
 90         {
 91             res=(aim%arr[index])?0:1;
 92             return res;
 93         }
 94         else
 95         {
 96             res=0;
 97             int k=aim/arr[index];
 98             for(int i=0;i<=k;i++)
 99                 res+=process(arr,index+1,aim-i*arr[index]);
100         }
101         return res;
102     }
103 };*/
104 
105 int main()
106 {
107     int a[3]={1,2,3};
108     vector<int> arr(a,a+3);
109     Exchange e;
110     cout<<e.countWays(arr,3,3);
111     
112     return 0;
113 }

 

 

 

  

posted @ 2018-04-15 17:07  ~君莫笑~  阅读(477)  评论(0编辑  收藏  举报