当前位置: 首页 > backend >正文

leetcode day37 474

474 一和零

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:

输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2 。

01背包问题

1、确定dp数组含义

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

2、初始化为0

3、确定递推公式

因为物品的重量有了两个维度,所以用滚动数组解题,这里用二维数组。

注意:滚动数组双重for循环,必须先遍历物品,再遍历背包,同时背包要倒序遍历。

01背包递推公式dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

这里转化一下,01的个数相当于weight[i],value就是字符串本身的个数1

int max(int a,int b){return a>b?a:b;
}
int findMaxForm(char** strs, int strsSize, int m, int n) {int dp[m+1][n+1]={};//最多有i个0 j个1的最大子集大小int cnt0,cnt1=0,i,j,k;for(i=0;i<strsSize;i++){char *s=strs[i];int len=strlen(s);cnt0=0,cnt1=0;for(j=0;j<len;j++){if(s[j]=='0')cnt0++;else cnt1++;}for(j=m;j>=cnt0;j--){//先遍历物品,再遍历背包容量for(k=n;k>=cnt1;k--){//倒序遍历,避免被覆盖dp[j][k]=max(dp[j][k],dp[j-cnt0][k-cnt1]+1);}}}return dp[m][n];
}

完全背包

携带研究材料(第七期模拟笔试)

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。

小明的行李箱所能承担的总重量是有限的,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述

第一行包含两个整数,n,v,分别表示研究材料的种类和行李所能承担的总重量 

接下来包含 n 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述

输出一个整数,表示最大价值。

输入示例
4 5
1 2
2 4
3 4
4 5
输出示例
10
提示信息

第一种材料选择五次,可以达到最大值。

二维数组会越界,采用一维数组

完全背包与01背包不同点:物品可以重复取多次

1、二维数组情况

(1)dp[i][j]表示[0,i]物品重量为j可重复选的最大价值
 (2)初始化
    dp[0][j]=dp[0][j-w[0]]+v[0]

(3)递推公式
   dp[i][j]=dp[i-1][j];//不放物品i
   dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
  这里是dp[i][j-w[i]]+v[i],与01背包不同,dp[i-1][j-w[i]]+v[i]

2、一维数组

(1)dp[j]表示物品重量为j可重复选的最大价值

 (2)初始化
    dp[j]=dp[j-w[0]]+v[0]

与01背包不同,01背包初始化为01即可

(3)递推公式

dp[j]=max(dp[j],dp[j-w[i]+v[i])

这里与01背包相同

#include<stdio.h>
#define N 10005
#define ll long long
ll max(ll a,ll b){return a>b?a:b;
}
ll w[N]={},v[N]={};
ll dp[N]={};
int main(){int n,m,i,j;scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%lld%lld",&w[i],&v[i]);}//dp[i][j]表示[0,i]物品重量为j可重复选的最大价值for(j=w[0];j<=m;j++){if(j>=w[0])dp[j]=dp[j-w[0]]+v[0];}for(i=1;i<n;i++){for(j=m;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}printf("%lld",dp[m]);return 0;
}

518 零钱兑换

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

    示例 1:

    输入:amount = 5, coins = [1, 2, 5]
    输出:4
    解释:有四种方式可以凑成总金额:
    5=5
    5=2+2+1
    5=2+1+1+1
    5=1+1+1+1+1
    

    示例 2:

    输入:amount = 3, coins = [2]
    输出:0
    解释:只用面额 2 的硬币不能凑成总金额 3 。
    

    示例 3:

    输入:amount = 10, coins = [10]
    输出:1

    因为题目数据保证结果符合 32 位带符号整数。所以要用INT_MAX防止数组越界

    一维数组

    1、dp[j]表示装满j钱的方法数

    2、初始化dp[0]=1

    3、确定动规方程

    二维dp 递推公式: dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]

    压缩成一维:dp[j] += dp[j - coins[i]]

    int change(int amount, int* coins, int coinsSize) {int dp[amount + 1];//dp[j]表示凑满j钱的方法memset(dp, 0, sizeof (dp));dp[0] = 1;for(int i = 0; i < coinsSize; i++){for(int j = coins[i]; j <= amount; j++){if (dp[j] < INT_MAX - dp[j - coins[i]])dp[j] += dp[j - coins[i]];//防止相加数据超过int}}return dp[amount];
    }

    http://www.xdnf.cn/news/2935.html

    相关文章:

  • 【论文阅读】PEEKABOO: Interactive Video Generation via Masked-Diffusion
  • 【神经网络与深度学习】改变随机种子可以提升模型性能?
  • DotNet 入门:(一) 环境安装
  • ElasticSearch入门
  • MYSQL三大日志、隔离级别(MVCC+锁机制实现)
  • 代码颜色模式python
  • 五种机器学习方法深度比较与案例实现(以手写数字识别为例)
  • 生活需要一些思考
  • 设计模式 | 详解常用设计模式(六大设计原则,单例模式,工厂模式,建造者模式,代理模式)
  • 力扣——206.反转链表倒序输出链表
  • Android开发——实现一个计算器
  • Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
  • PyTorch实际上是按照**行优先(Row-Major)**的方式存储数据
  • 基于Arduino的STM32F103RCT6最小系统板的测试及串口通讯
  • 初识Redis · 缓存
  • 网络原理 - 11(HTTP/HTTPS - 2 - 请求)
  • MES系列-ISO95 IEC/ISO 62264
  • 精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读
  • claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
  • 【Java学习】Java的CGLIB动态代理:通俗解释与使用指南
  • 自定义指令input中前面不能输入空格
  • java练习4
  • 【记录一下】RagFlow 本地安装详细步骤(Windows + Linux)
  • 一种在使用Kaggle并遇上会话中断时强行保存数据的方法
  • python练习:求两数相加之和
  • 【Git】项目多个分支开发、维护与优化处理 ing
  • 第二节:文件系统
  • Java基础
  • 1.6二重积分
  • 浅谈人工智能发展现状