换零钱问题(dp问题)

 大面值纸币换成小面值纸币问题,dp问题
 将amount换成coins数组中的小面值零钱,求最少换成多少张

#include
#include
using namespace std;
typedef long long ll;
const ll N=1e5+10;
int main(){
    //大面值纸币换成小面值纸币问题,dp问题
    //将amount换成coins数组中的小面值零钱,求最少换成多少张
    ll amount;//初始钱的大小
    cin >> amount;
    ll coins[6] = {1, 5, 10, 20, 50, 100};

    //初始化数组dp,长度为amount+1,全部元素初始化为-1
    //dp数组中的元素表示:dp[i]的钱最少可以换成多少张
    vector dp(amount + 1, -1);
    dp[0] = 0;//金额为0的最优解为dp[0]=0
    //变量i从1循环至amount,依次计算金额1至amount的最优解
    for (ll i = 1; i <= amount;i++){
        //对于每个金额i,使用变量j遍历面值coins数组
        for (ll j = 0;j<6;j++){
            //所有小于等于i的面值coins[j],如果金额i-coins[j]有最优解
            if(coins[j]<=i&&dp[i-coins[j]]!=-1){
                //如果当前金额还未计算或者dp[i]比正在计算的最优解大
                if(dp[i]==-1||dp[i]>dp[i-coins[j]]){
                    dp[i] = dp[i - coins[j]] + 1;
                }
            }
        }
    }
    cout<

你可能感兴趣的:(算法,动态规划)