找零钱

来源:互联网 发布:淘宝产品销售方案 编辑:程序博客网 时间:2024/04/29 07:59

有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。

给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。(最少几张)

测试样例:
[1,2,4],3,3
返回:2
class Exchange {public:       //要找的钱数aim,货币种类n,货币数组penny    int countWays(vector<int> penny, int n, int aim) {// 优化过后的动态规划        if (n == 0 || aim == 0)     return 0;        int dp[n][aim+1];//要找的钱数为0-aim,所以是aim+1种        for (int i = 0; i < n; i++){//找钱为0,方法只有一种,不使用任何货币 //设置第一列的数目,全部为1            dp[i][0] = 1;        }             for (int i = 1; i <= aim; i++) //只使用penny[0]货币情况下,组成的方法数 //设置第一行的数目        {              if (i % penny[0] == 0){  //aim为penny[0]整数倍的位置才能被penny[0]组成                dp[0][i] = 1;            }else{                   //其他位置只有enny[0]不能组成                dp[0][i] = 0;            }         }        for (int i = 1; i < n; i++){    //设置其他行和列            for (int j = 1; j <= aim; j++){                   if (j-penny[i]>=0){           //包括货币面值为penny[i]的方法数                        dp[i][j] = dp[i-1][j] + dp[i][j-penny[i]];                          }else{                       dp[i][j] = dp[i-1][j];    //不包括penny[i]的方法数                }                    }        }        return dp[n-1][aim];//编号从0开始,所以最后一个货币种类为n-1    }};


原创粉丝点击