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.pswp.cn/bicheng/78922.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78922.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/78922.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    二、信息時代社會結構的轉變

    到了信息時代,以及在核武器的前提下,上述的社會結構的邏輯,就有了一個根 本性的轉變,就是暴力的成本和收益,都在下降。 暴力的成本在降低。比如說槍支,它的制造和分發都變得非常容易。現在我們都 知道有 3D 打印,它就好像工業時代的印刷機,印刷圣經或者書籍,使知識更加 普及和容…

    Elasticsearch 堆內存使用情況和 JVM 垃圾回收

    作者&#xff1a;來自 Elastic Kofi Bartlett 探索 Elasticsearch 堆內存使用情況和 JVM 垃圾回收&#xff0c;包括最佳實踐以及在堆內存使用過高或 JVM 性能不佳時的解決方法。 堆內存大小是分配給 Elasticsearch 節點中 Java 虛擬機的 RAM 數量。 從 7.11 版本開始&#xff…

    C++之類和對象:構造函數,析構函數,拷貝構造,賦值運算符重載

    前提&#xff1a;如果一個類是空類&#xff0c;C中空類中真的什么都沒有嗎&#xff0c;不是的&#xff0c;編譯器會自動生成6個默認成員函數。默認成員函數&#xff1a;用戶沒有顯式實現&#xff0c;編譯器會生成的成員函數稱為默認成員函數。 默認成員函數&#xff1a;構造函…

    【專題五】位運算(1):常見位運算操作總結

    &#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

    小草GrassRouter多卡聚合路由器聚合衛星、MESH網絡應用解決方案

    一、多網融合解決方案 衛星網絡融合? 支持接入衛星通信模塊&#xff0c;在無地面網絡覆蓋的極端場景&#xff08;如偏遠山區、海洋救援&#xff09;下&#xff0c;形成“5G衛星”雙鏈路冗余傳輸&#xff0c;衛星鏈路可作為核心通信備份&#xff0c;確保關鍵指令和視頻數據實…

    【Mybatis】Mybatis基礎

    文章目錄 前言一、搭建MyBatis1.1 創建maven工程1.2 加入log4j日志功能1.3 MyBatis的增刪改查1.4 核心配置文件詳解 二、MyBatis獲取參數值的兩種方式2.1 單個字面量類型的參數2.2 多個字面量類型的參數2.3 map集合類型的參數2.4 實體類類型的參數2.5 使用Param標識參數 三、 M…

    AI四大邊界

    大模型訓練的邊界并非由單一因素決定&#xff0c;而是技術、倫理、法律及實際應用需求共同作用的結果。以下從四個維度解析其邊界來源&#xff1a; 一、技術邊界&#xff1a;資源與能力的雙重限制 計算資源瓶頸 成本與算力&#xff1a;大模型訓練依賴海量GPU/TPU資源&#xff…

    Twitter 工作原理|架構解析|社交APP邏輯

    這是對Twitter 工作原理&#xff5c;架構解析&#xff5c;社交APP邏輯_嗶哩嗶哩_bilibili的學習&#xff0c;感謝up小凡生一 在兩年半前&#xff0c;埃隆馬斯克收購了Twitter&#xff0c;并且進行了一系列重大改革。今天我們來解析一下這個全球知名社交平臺的架構。首先&#x…

    Java基礎學習內容大綱

    Java基礎學習內容大綱 第一階段:建立編程思想 ? Java概述:如何快速學習Java技術、Java歷史、Java特點、Sublime、Java運行機制、JDK、轉義字符、Java開發規范、Java API ? 變量:數據類型、變量基本使用、數據類型轉換 ? 運算符:運算符介紹、算數運算符、關系運算符、…

    如何對多維樣本進行KS檢驗

    對于形狀為 ( 10000 , 1 , 304 ) (10000, 1, 304) (10000,1,304)的三維數據&#xff0c;若需使用scipy.stats.ks_2samp進行KS檢驗&#xff0c;可按以下步驟處理&#xff1a; 數據降維 KS檢驗要求輸入為一維數組&#xff0c;需將三維數據展平或按特定維度聚合&#xff1a; ? 方…

    在 VMware 虛擬機中安裝 Windows7

    文章目錄 前言1.安裝VMware 虛擬機1. VMware虛擬機軟件安裝2. 虛擬機創建配置&#xff08;超詳細步驟&#xff09;3. Windows7系統安裝 3、安裝 VMware tools4. VMware Tools安裝與優化5. 總結與常見問題 前言 最近有不少朋友在問如何在電腦上同時使用多個操作系統&#xff0c…

    直播預告|TinyVue 組件庫高級用法:定制你的企業級UI體系

    TinyVue 是一個跨端跨框架的企業級 UI 組件庫&#xff0c;基于 renderless 無渲染組件設計架構&#xff0c;實現了一套代碼同時支持 Vue2 和 Vue3&#xff0c;支持 PC 和移動端&#xff0c;包含 100 多個功能豐富的精美組件&#xff0c;可幫助開發者高效開發 Web 應用。 4 月 …

    分治而不割裂—分治協同式敏捷工作模式

    分治而不割裂&#xff1a;解密敏捷協同工作模式如何驅動大企業持續領跑 在數字化浪潮中&#xff0c;亞馬遜僅用11天完成Prime Day全球技術架構升級&#xff0c;華為5G基站項目組創造過單周迭代47個功能模塊的紀錄&#xff0c;這些商業奇跡的背后&#xff0c;都隱藏著一個共性秘…

    Python列表全面解析:從基礎到高階操作

    一、為什么需要列表&#xff1f; 在Python中&#xff0c;列表是可變有序序列&#xff0c;用于存儲多個元素的容器。相較于單一變量存儲獨立值&#xff0c;列表能更高效地管理批量數據&#xff0c;其特點包括&#xff1a; ?引用存儲&#xff1a;列表元素存儲的是對象的引用?…

    Spring知識點梳理

    一、Spring&#xff08;Spring Framework&#xff09; 1、IOC&#xff08;控制反轉&#xff09; 1&#xff09;什么是IOC控制反轉&#xff1f; 為了解藕&#xff0c;有反轉就有“正轉”&#xff0c;“正轉”就是程序員手動 new對象&#xff1b;“反轉”就是將對象的創建、對…

    SpringBoot啟動后自動執行方法的各種方式-筆記

    1. SpringBoot啟動后自動執行方法的各種方式 1.1 PostConstruct 注解 作用&#xff1a;在依賴注入完成后執行初始化方法。 適用場景&#xff1a;需要在Bean初始化時執行某些操作&#xff08;如配置、預加載數據&#xff09;。 注意&#xff1a;該方法在Bean初始化階段執行&…

    基礎知識-java流steam

    Java Stream 流詳解 一、Stream 概述 #mermaid-svg-ZXmu5UZgAcGGq8EN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-icon{fill:#552222;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-text{fil…

    8.Android(通過Manifest配置文件傳遞數據(meta-data))

    配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…

    java 解析入參里的cron表達式,修改周時間

    文章目錄 前言一、java 解析入參里的cron表達式,修改周時間二、使用步驟1.示例 總結 前言 一、java 解析入參里的cron表達式,修改周時間 示例&#xff1a; 第一種: 0 0 0,16 ? * 0,1 第2種 0 0 0,16 ? * 1-7 第3種 0 0 0,16 ? * ? 第4種 0 0 0,16 ? * * 二、使用步驟 1…

    DTO,VO,PO,Entity

    1. DTO (Data Transfer Object) 定義 DTO 是數據傳輸對象&#xff0c;用于在不同系統或層之間傳輸數據。 目的 簡化數據傳輸&#xff0c;降低耦合&#xff0c;通常只包含需要傳輸的字段&#xff0c;避免暴露內部實現細節。 使用場景 Controller 和 Service 或 遠程調用 之…