自学内容网 自学内容网

动态规划-完全背包问题——518.零钱兑换II

1.题目解析

建议先看 322.零钱兑换可以 更加轻松的理解本题

题目来源

518.零钱兑换——力扣

 测试用例

2.算法原理

1.状态表示

本题要求返回所有情况,所以dp值就代表所有的方法数,即

dp[i][j]:在[1,i]个硬币中选择不同面值的硬币,此时面值总和恰好为j时所有的选择方法数

2.状态转移方程

3.初始化

4.填表顺序

从上到下,每一行从左到右

5.返回值 

返回最后一个位置的值

3.实战代码

class Solution {
public:
    int change(int amount, vector<int>& coins) 
    {
        int n = coins.size();
        vector<vector<double>> dp(n+1,vector<double>(amount+1));
        dp[0][0] = 1;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 0;j <= amount;j++)
            {
                dp[i][j] += dp[i-1][j];
                if(j >= coins[i-1] && dp[i-1][j-coins[i-1]] != -1)
                {
                    dp[i][j] += dp[i][j-coins[i-1]];
                }
            }
        } 
        return dp[n][amount];
    }
};

代码解析 

4.优化


原文地址:https://blog.csdn.net/2301_80689220/article/details/143825041

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!