首页 > 编程语言 >代码随想录算法训练营第四十四天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

代码随想录算法训练营第四十四天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

时间:2024-03-12 15:22:36浏览次数:33  
标签:vector 背包 int 第四十四 随想录 II bag 遍历 dp

完全背包

题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com)

思路:完全·背包问题和01背包的区别在于同一个物品可以被重复放入,在代码里的区别就是内部遍历背包的for循环由倒序变成了正序。而且如果我们压缩了一维的话,如我的做法,两个for循环的顺序也是无所谓的。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,v;
    cin>>n>>v;
    vector<int> dp(v+1,0);
    vector<vector<int>> bag(n+1,vector<int>(2,0));
    for(int i=0;i<n;i++){
        cin>>bag[i][0]>>bag[i][1];
    }
    for(int j=0;j<n;j++){
        for(int k=1;k<=v;k++){
            if(k>=bag[j][0])
                dp[k]=max(dp[k],dp[k-bag[j][0]]+bag[j][1]);
        }
    }
    
    cout<<dp.back();
    return 0;
}

零钱兑换 II 

题目链接:518. 零钱兑换 II - 力扣(LeetCode)

思路:记住状态转移方程不是dp[j]=dp[j-coins[i]]+1而是dp[j]+=dp[j-coins[i]];

不过值得注意的是:

在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

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=1;j<=amount;j++){
                if(j>=coins[i])dp[j]+=dp[j-coins[i]];
            }
        }
        return dp.back();
    }
};

组合总和 Ⅳ  

题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)

思路:用long都能超,我真是服了这个样例了。

避免超限制的方法:加一个判断dp[j] < INT_MAX - dp[j - nums[i]]因为这一题动态规划有个坑,就是答案保证最终答案的组合数在32位范围内,但是如果在taraget之前的数字组合数是可能超过INT_MAX的,甚至更大,但因为最终答案不会超过,所以target肯定不会利用到这些超过INT_MAX的数据的,所以忽略掉那些会超过INT_MAX的就可以。

但是莫名其妙的改成unsigned int 就能通过样例,long就不行。

值得注意的是尽管本题问的是组合数,但是事实上答案是排列数目,因此如上一题所说,我们要先遍历背包容量,再遍历物品。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target + 1, 0);
        dp[0] = 1;
        for (int j = 1; j <= target; j++) {
            for (int i = 0; i < nums.size(); i++) {
                if (j >= nums[i] && dp[j] < INT_MAX - dp[j - nums[i]])
                    dp[j] += dp[j - nums[i]];
            }
        }
        return dp.back();
    }
};

 

标签:vector,背包,int,第四十四,随想录,II,bag,遍历,dp
From: https://www.cnblogs.com/Liubox/p/18068385

相关文章

  • 代码随想录算法训练营第七天| 454. 四数相加 II 383. 赎金信
    454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/、publicintfourSumCount(int[]nums1,int[]nums2,int[]nums3,int[]nums4){intres=0;HashMap<Integer,Integer>map=newHashMap<>();for(inti:nu......
  • 代码随想录算法训练营第六天| 242. 有效的字母异位词
    242.有效的字母异位词https://leetcode.cn/problems/valid-anagram/description/publicbooleanisAnagram(Strings,Stringt){char[]sChar=s.toCharArray();char[]tChar=t.toCharArray();Arrays.sort(sChar);Arrays.sort(tChar......
  • 代码随想录算法训练营第四十一天 | 416. 分割等和子集,● 01背包问题,你该了解这些! 滚
     46.携带研究材料(第六期模拟笔试)时间限制:5.000S空间限制:128MB题目描述小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据......
  • 代码随想录算法训练营第四十三天|● 1049. 最后一块石头的重量 II ● 494. 目标和
    最后一块石头的重量 II 题目链接:1049.最后一块石头的重量II-力扣(LeetCode)思路:尽可能将石头分成重量相近的两堆,结果一定最小,因此问题可以转换为分割子集。dp[i]的含义是背包容量为i的背包能装下的最大重量,由于题目中最大重量是15000,所以我们申请15001的vector。注意,结果不......
  • 45. 跳跃游戏 IIc
    暴力DFS超时了。先放着把。intmin;voiddfs(int*nums,intnumsSize,intindex,intcount){if(index>=numsSize-1){if(count<min)min=count;return;}for(inti=nums[index];i>0;i--){dfs(nums,numsSize,index+i,count+1);......
  • MPU6050 memcmp(firmware+ii, cur, this_write)初始化问题|MPU6050固件库加载问题
    使用MPU6050dmp固件库时候报错:MPU6050固件库加载,最后运行到“memcmp(firmware+ii,cur,this_write)”无法通过!从网上查找了相同问题的解答,发现修改了IIcSDA与SCL端口但是头文件的中的宏定义没有修改未修改之前的端口:修改之后的端口:这里在修改宏定义的时候遇到了些问......
  • 122. 买卖股票的最佳时机 II c
    、动态规划太难啦!intgetmax(inti,intj){if(i>j)returni;returnj;}intmaxProfit(int*prices,intpricesSize){if(pricesSize==1)return0;int**dp=(int**)malloc(sizeof(int*)*pricesSize);//dp[i][0/1]第i结束交易时天的最大收益,0/1代表有......
  • 动态规划 代码随想录
    step:确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组需要重做的题:343(整数拆分) 96(二叉搜索树的种类)简单题:509.斐波那契数   70.爬楼梯   746.使用最小花费爬楼梯注意用step一步步来,注意dp【0】是否有含义。 ......
  • IIC
    IICIIC总线结构图IIC协议时序软件模拟IIC协议示例代码起始信号voidiic_start(void){/*SCL为高电平期间,SDA从高电平往低电平跳变*/IIC_SDA(1); IIC_SCL(1);iic_delay(); IIC_SDA(0); iic_delay();IIC_SCL(0); iic_delay();......
  • 代码随想录 第17天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之
    leetcode:110.平衡二叉树-力扣(LeetCode)classSolution{publicbooleanisBalanced(TreeNoderoot){returngetblan(root)!=-1;}privateintgetblan(TreeNoderoot){//为空退出if(root==null)return0;//左节......