首页 > 其他分享 >dp完全背包问题解组合问题——零钱兑换

dp完全背包问题解组合问题——零钱兑换

时间:2022-11-26 18:08:55浏览次数:58  
标签:背包 凑出 int coins 零钱 amount 遍历 dp


dp完全背包问题解组合问题——零钱兑换_算法


本题为完全背包问题,遍历容量需要顺序遍历

class Solution {
public:
int change(int amount, vector<int>& coins) {
// 完全背包 顺序遍历
// 背包容量为amount
int n = coins.size();
// dp[i][j]:有coin[0]...coin[i]这i+1个硬币,凑出amount,有dp[i][j]种方法
vector<vector<int>> dp(n, vector<int>(amount + 1, 0));
dp[0][0] = 1;
for(int j = 1; j <= amount; j++){
// 只有coins[0]一枚硬币,若能整除,则只有1种方法凑出j,若不能整除,则不能凑出j
dp[0][j] = (j % coins[0] == 0) ? 1 : 0;
}
// 遍历硬币
for(int i = 1; i < n; i++){
// 遍历面值
for(int j = 0; j <= amount; j++){
if(j < coins[i]){
// 当前面值 < 当前硬币,无法使用当前硬币,依然使用前0~i-1种硬币凑出面值j
dp[i][j] = dp[i-1][j];
}else{
// 当前面值 >= 当前硬币
// dp[i-1][j]表示不使用当前硬币凑出j的方法数
// dp[i][j-coins[i]]则表示使用至少使用一枚coins[i]硬币凑出j,完全背包,使用本层计算结果
// 这里不能是dp[i-1][j-coins[i]],因为这表示只使用一枚coins[i]凑出面值j
dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]];
}
}
}
return dp[n-1][amount];
}
};
class Solution {
public:
int change(int amount, vector<int>& coins) {
// 完全背包 顺序遍历
// 背包容量为amount
int n = coins.size();
// dp[j]:使用前i钟货币凑出j,有dp[j]种方法
vector<int> dp(amount + 1, 0);
dp[0] = 1;
// 遍历硬币
for(int i = 0; i < n; i++){
// 遍历面值
for(int j = coins[i]; j <= amount; j++){
dp[j] = dp[j] + dp[j-coins[i]];
}
}
return dp[amount];
}
};

dp完全背包问题解组合问题——零钱兑换_算法_02


01背包 —> 逆序

完全背包 —> 顺序

组合 —> 先遍历物品

排列 —> 先遍历容量

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
// 完全背包---> 顺序
// 组合 ---> 先遍历物品
vector<int> dp(amount + 1, amount + 1);
dp[0] = 0;
for(int i = 0; i < coins.size(); i++){
for(int j = coins[i]; j <= amount; j++){
// 不使用coins[i],使用coins[i]
// 用dp[j-coins[i]]个硬币凑出j-coins[i],再用1个coins[i]凑出coins[i]
// dp[j-coins[i]]在二维数组中使用的是本层数据,表示使用0...i种货币凑出j-coins[i],再用1个coins[i]凑出coins[i]
// 这样dp[j-coins[i]]+1就能表示至少使用1个coins[i],凑出j,所需要的货币数量
dp[j] = min(dp[j], dp[j-coins[i]] + 1);
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};


标签:背包,凑出,int,coins,零钱,amount,遍历,dp
From: https://blog.51cto.com/BugMaker/5889083

相关文章

  • wordpress代码实现相关文章的几种方法
    我们在制作wordpress主题的时候经常会为文章模板添加一些相关文章的功能丰富,他们有的时候出现在侧栏,有的时候出现在文章的底部相关文章这块,当然WordPress相关文章的插件也......
  • 一种通过udp进行无确认ip的双向的通信
    前言udp是一种不可靠的通信,但是有些时候还是会有使用。今天分享一个示例:主体逻辑,一个端口广播地址,接收到ip地址数据后,其他端口基于这个ip进行bind绑定,最后通信,这样可以保......
  • Educational DP Contest——J 期望dp
    题目链接https://atcoder.jp/contests/dp/tasks/dp_jAC代码点击查看代码#include<bits/stdc++.h>#definerep(i,x,y)for(inti=x;i<=y;++i)#defineper(i,x,y)f......
  • Golang中一个不错的处理 JSON 的库 go-dproxy
    国庆七天,你是吃多了,还是睡多了?放假七天转眼即逝,接下来的七天可能你又觉得会很漫才。言归正传。Golang虽然自己就带了JSON(encoding/json)处理的库,也有第三方的simplejs......
  • 分享WordPress博客搜索引擎优化的六点经验
    wordpress是非常不错的博客程序,也是很多博客爱好者所喜欢的建站程序之一,wordpress不仅仅模版丰富,而且有足够的插件可以供我们选择,wordpress在搜索引擎......
  • Job for xrdp.service failed because the control process exited with error code.x
    ​解决方法:touch/var/log/xrdp.logchownxrdp:adm/var/log/xrdp.logchmod640/var/log/xrdp.logReboot systemctlstartxrdpsystemctlstatusxrdp 来自......
  • WordPress 主题教程 #5c:日志元数据
    日志元数据是从零开始创建WordPress主题系列教程的五篇的第三部分,今天我们将开始讲解日志的元数据(Postmetadata):日期(date),分类(categories),作者(author),评论数(numberofcomment......
  • WordPress 主题教程 #6:侧边栏
    侧边栏是从零开始创建WordPress主题系列教程的第六篇,这一篇我们主要讲解WordPress主题的侧边栏,让你很快掌握它的结构,并能编码和样式化它。在开始侧边栏之前,这是现在in......
  • [DP 倍增]区间的连续段
    [DP倍增]区间的连续段题目​​题目链接​​思路题意:给你长度为n的数组,由m次查询,每次查询问对于区间[l,r],最少把区间内数切成几段,使得每一段满足和都<=k。个人学习记录使用......
  • [DP/贪心 时间] P1717 钓鱼
    [DP时间]P1717钓鱼​​题目链接​​题目思路贪心可以做的比较简单,不过这里打算练习一下DP写法为了简化计算,把5分钟设为单位时间状态表示表示走到第i个湖钓鱼,耗时j属性:ma......