当先锋百科网

首页 1 2 3 4 5 6 7

已知不同面值的钞票,求如何用最少数量的钞票组成某个金额,求可以使用的最少钞票数量。如果任意数量的已知面值钞票都无法组成该金额,则返回-1
例如:
钞票面值:[1,2,5]; 金额:11=5+5+1;需要3张。
钞票面值:[2];金额:3;无法组成,返回-1。
钞票面值:[1,2,5,7,10];金额:14=7+7,需要2张。

#include <vector>
class Solution
{
public:
 Solution(){}
 ~Solution(){}
 int coinsChange(std::vector<int>& coins, int amount)
 {
  std::vector<int> dp;
  for (int i = 0; i <=amount; i++)
  {
   dp.push_back(-1);
  }
  dp[0] = 0;
  for (int i = 1; i <=amount; i++)
  {
   for (int j = 0; j < coins.size(); j++)
   {
    if (i-coins[j]>=0&&dp[i-coins[j]]!=-1)       
     //i-coins[j]>=0的等号不可忽略,等号存在时相当于在初始化coins向量的dp值为1
    {
     if (dp[i]==-1||dp[i]>dp[i-coins[j]]+1)
     {
      dp[i] = dp[i - coins[j]] + 1;
     }
    }
   }
  }
  return dp[amount];
 }
};
int main()
{
 Solution solve;
 std::vector<int> coins;
 coins.push_back(1);
 coins.push_back(2);
 coins.push_back(5);
 coins.push_back(7);
 coins.push_back(10);
 for (int i = 1; i <=14; i++)
 {
  printf("dp[%d]=%d\n",i, solve.coinsChange(coins, i));
 }
 return 0;
}

运行结果为:

dp[1]=1
dp[2]=1
dp[3]=2
dp[4]=2
dp[5]=1
dp[6]=2
dp[7]=1
dp[8]=2
dp[9]=2
dp[10]=1
dp[11]=2
dp[12]=2
dp[13]=3
dp[14]=2