给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
输入: amount = 3, coins = [2]
输出: 0
解释: 只用面额2的硬币不能凑成总金额3。
输入: amount = 10, coins = [10]
输出: 1

解题

代码:

class Solution {
public:int change(int amount, vector<int>& coins) {int row=coins.size()+1;int col=amount+1;if(amount==0)return 1;if(row==1)return 0;vector<vector<int>> dp(row,vector<int>(col,0));for(int i=0;i<row;i++)dp[i][0]=1;for(auto a:dp[0])cout<<a;cout<<endl;for(int i=1;i<row;i++){for(int j=1;j<col;j++){if(j-coins[i-1]<0)dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]];}}for(auto b:dp[1])cout<<b;return dp[row-1][col-1];}
};

那么接下来如何进行状态压缩呢

我们发现只是和dp[i][…]以及dp[i-1][…]有关.所以压缩;

举个例子,我们将table[0][j]状态存在二维表的第0行,接着推出table[1][j]对应的值,并将table[1][j]的状态存放于二维表的第1行。再接着推出table[2][j]的状态时,table[0][j]的状态已经没有保存意义了,因此直接将table[2][j]的状态保存到二维表的第0行,并以此类推,使数组空间得到循环利用。

有时候压缩也要注意遍历的方向,不可以影响后面的结果
比如
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].

class Solution {
public:int change(int amount, vector<int>& coins) {int row=coins.size()+1;int col=amount+1;if(amount==0)return 1;if(row==1)return 0;vector<int> dp(amount+1,0);dp[0]=1;for(int i=1;i<row;i++){for(int j=1;j<col;j++){if(j-coins[i-1]>=0)dp[j]=dp[j]+dp[j-coins[i-1]] ;        }}return dp[amount];}
};
class Solution {
public:bool canPartition(vector<int>& nums) {//动态规划int sum=0;for(auto a:nums)sum+=a;if(sum%2!=0) return false;sum=sum/2;// int row=nums.size()+1;// int col=sum+1;// vector<vector<bool>> dp(row,vector<bool>(col,false));// for(int i=0;i<row;i++)// dp[i][0]=true;// cout<<dp[1][0];// for(int i=1;i<row;i++)// {//     for(int j=1;j<col;j++)//     {//        if(j-nums[i-1]<0) //        dp[i][j]=dp[i-1][j];//        else//         dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]];//     }// }// return dp[row-1][col-1];vector<bool> dp(sum+1,false);dp[0]=true;for(int i=1;i<=nums.size();i++){for(int j=dp.size();j>0;j--)// **为了不影响结果,所以选择遍历方向时候要适当改变**{if(j-nums[i-1]>=0)dp[j]=dp[j-nums[i-1]]||dp[j];}}return dp[sum];}
};

leetcode动态规划之零钱兑换问题相关推荐

  1. LeetCode:322. 零钱兑换(python)

    LeetCode:322. 零钱兑换(python) 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  2. 动态规划学习:零钱兑换

    change 一.零钱兑换问题I 二.零钱兑换问题II 一.零钱兑换问题I 给定一组面额硬币,每组硬币可能有多个,给定一个总金额amount,求组成总金额所需的最少硬币数,若组不成返回-1 代码实现 ...

  3. leetcode算法题--零钱兑换

    原题链接:https://leetcode-cn.com/problems/coin-change/ 相关题目:leetcode算法题–完全平方数★ 动态规划 dp[i] i从0到amount,dp[ ...

  4. 【LeetCode】322. 零钱兑换 结题报告 (C++)

    原题地址:https://leetcode-cn.com/problems/coin-change/ 题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成 ...

  5. leetcode 322: 零钱兑换

    题目描述: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组合能组成总金额,返回 ...

  6. 动态规划——零钱兑换(Leetcode 322)

    题目选自Leetcode 322.零钱兑换 想必大家看一眼就明白了(bushi),这就是动态规划的背包问题~ 算法思想 那么,既然知道了这是个动态规划问题,就要思考如何列出正确的状态转移方程? 1.确 ...

  7. LeetCode刷题复盘笔记—一文搞懂完全背包之322. 零钱兑换问题(动态规划系列第十四篇)

    今日主要总结一下动态规划完全背包的一道题目,322. 零钱兑换 题目:322. 零钱兑换 Leetcode题目地址 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amo ...

  8. LeetCode 518. 零钱兑换 II(动态规划)

    1. 题目 给定不同面额的硬币和一个总金额. 写出函数来计算可以凑成总金额的硬币组合数. 假设每一种面额的硬币有无限个. 示例 1: 输入: amount = 5, coins = [1, 2, 5] ...

  9. 【必备算法】动态规划:LeetCode题(六)322. 零钱兑换,518. 零钱兑换 II

    322. 零钱兑换² 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: ...

最新文章

  1. 小程序获取图片的宽高
  2. Hibernate-ORM:05.Hibernate中的list()和iterator()
  3. 怎么实现登录之后跳转到登录之前的页面?SpringMVC+Freemarker
  4. 学习笔记(01):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?
  5. 非监督学习的单层网络分析
  6. c语言 结构体_C语言 技能提升 系列文章 (三)结构体
  7. iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
  8. sql虚拟服务器安装,安装SQL Server 2012服务器
  9. solidity教程(三)高级 Solidity 理论
  10. 谷歌浏览器JSON格式化插件
  11. OpenGL学习小结
  12. 删除硬盘文件夹失败解决方法
  13. 在ADSP-BF561上使用x264(4):确认热点
  14. 用showdown给HTML网页插入markdown笔记
  15. podman基础教程
  16. 英语不好,能不能学软件编程?不懂英文能学编程吗
  17. VSTS Overview
  18. 医学图像处理软件MITK/VTK/ITK资料储备
  19. Android Keyboard/Touch Panel分析
  20. 激动人心,2022开放原子全球开源峰会报名火热开启

热门文章

  1. HTTP 请求方法 GET/POST/PUT/DELETE
  2. 6个简单好用的收件箱清理及管理工具
  3. 【ROS】将odom里程计数据转换为path路径消息
  4. flask-socketio实现的网页聊天室(一)
  5. HDU 4735 舞蹈链可重复覆盖
  6. python怎么读音发音英语-python英文怎么读
  7. 水果数据集(Fruit-Dataset )+水果分类识别训练代码(支持googlenet, resnet, inception_v3, mobilenet_v2)
  8. php 获取到当前ip,获取当前IP地址,跳转到对应城市网站。
  9. html制作打字游戏,js实现打字小游戏
  10. OpenWrt -【记录】群辉NAS上安装软路由