Day43 动态规划第五天
LeetCode 518.零钱兑换II
dp数组的含义:装满容量为j的背包有dp[j]种方法
递推公式:dp[j]+=dp[j-coins[i]]。
初始化:dp[0]=1,dp[j]=0
遍历顺序:先物品后背包,背包内从小到大
本题是组合数,所以必须先物品后背包,先背包后物品时排列数。
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1,0);
dp[0]=1;
for(int i=0;i<coins.size();i++){
for(int j=coins[i];j<=amount;j++){
dp[j]+=dp[j-coins[i]];
}
}
return dp[amount];
}
};
LeetCode 377.组合总和IV
与上一题的分析几乎相同,唯一的区别在于遍历顺序不同,本题是排列数,先背包后物品。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1,0);
dp[0]=1;
for(int i=0;i<=target;i++){
for(int j=0;j<nums.size();j++)
if(i-nums[j]>=0 && dp[i]<INT_MAX-dp[i-nums[j]])
dp[i]+=dp[i-nums[j]];
}
return dp[target];
}
};
卡码网57.爬楼梯进阶版
本题一次可以爬多个台阶之后就变成了完全背包问题,也不难,按照完全背包的思路来解决即可。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m) {
vector<int> dp(n+1,0);
dp[0]=1;
for(int i=1;i<=n;i++) { // 遍历背包
for(int j=1;j<=m;j++) { // 遍历物品
if(i-j>=0) dp[i]+=dp[i-j];
}
}
cout<<dp[n]<<endl;
}
}
完全背包,加油!
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【代码随想录算法训练Day43】LeetCode 518.零钱兑换II、LeetCode 377.组合总和IV、LeetCode 70.爬楼梯
发表评论 取消回复