描述
链接
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
Example 1:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
题解
dp[i]
代表面值为i的币值需要的最少零钱数额。
显然,dp[i]=min(dp[i],dp[i-coins[j])
代码
int min(int a, int b){
return a<=b?a:b;
}
int coinChange(int* coins, int coinsSize, int amount) {
int dp[amount+1];
for(int i=0;i<amount+1;i++){
dp[i]=amount+1;
}
dp[0]=0;
for(int i=1;i<=amount;i++){
for(int j=0;j<coinsSize;j++){
if(i>=coins[j]){
dp[i]=min(dp[i],dp[i-coins[j]]+1);
}
}
}
return dp[amount]==amount+1 ?-1:dp[amount];
}
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
const int N = coins.size();
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
for (int coin : coins) {
for (int i = coin; i <= amount; ++i) {
//未计算过
if (dp[i - coin] != INT_MAX) {
dp[i] = min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
};
#include <iostream>
#include<stdio.h>
#define maxn 105
#define max_ 1000005
using namespace std;
int coins[maxn];
int dp[max_];
int Min(int a, int b){
return a<=b?a:b;
}
int coinChange(int* coins, int coinsSize, int amount) {
int Size=amount+1;
int dp[Size];
for(int i=0;i<=amount;i++){
dp[i]=amount+1;
}
dp[0]=0;
// for(int i=0;i<coinsSize;i++){
// for(int j=coins[i];j<=amount;j++){
if(dp[i-coins[i]]!=(amount+1))
// dp[j]=min(dp[j],dp[j-coins[i]]+1);
// }
// }
for(int i=1;i<=amount;i++){
for(int j=0;j<coinsSize;j++){
if(i>=coins[j]){
dp[i]=min(dp[i],dp[i-coins[j]]+1);
}
}
}
return dp[amount]==amount+1 ?-1:dp[amount];
}
int main()
{
int n,amount;
while(scanf("%d",&n)==1){
for(int i=0;i<n;i++){
scanf("%d",&coins[i]);
}
scanf("%d",&amount);
int res=coinChange(coins,n,amount);
printf("%d\n",res);
}
return 0;
}