day37动态规划+三.Github链接本地仓库

一.动态规划

474.一和零

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

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

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

思路:这道题更像是另一种的0-1背包问题 其中m和n相当于背包容量,字符串本身的个数相当于物品的价值(value[i])。首先初始化dp数组,然后要统计每个字符串的0和1的数量,才能进行下面的操作,

cpp 复制代码
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
    vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 默认初始化0
       for (string str : strs) { // 遍历物品
            int oneNum = 0, zeroNum = 0;
            for (char c : str) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
       for(int i=m;i>=zeroNum;i--){//m n相当于背包容量 要从大到小去遍历
        for(int j=n;j>=oneNum;j--){// 
            dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);
        }
       }
      }
        return dp[m][n];
    }  
};  

完全背包问题:

完全背包问题和0-1背包问题最主要的区别在于一个物品是能取一次还是取多次。

在代码上的区别的话就是滚动数组,第二个for循环是正序遍历,因为正序遍历和倒序遍历的区别就是在于能否重复选取。

518.零钱兑换II

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

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

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

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

思路: 是一种完全背包问题,amount是要凑的零钱数 相当于背包容量,coins相当于物品 用来凑成amount的(凑背包容量),注意 求装满背包有几种方法类似的题目,递推公式基本都是这样的

dp[j] += dp[j - nums[i]]

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

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

为什么呢? 因为求组合数时 外层先遍历物品,就是先拿出一件物品遍历一遍,之后在拿出一件物品遍历一遍,不会出现{2,1}的情况,而外层for遍历背包,内层for循环遍历物品。物品是会被反复取到的。详细说一说的话就是:

先遍历物品后遍历背包是这样,比如,外层循环固定coins【1】,在内层循环遍历背包时,随着背包不断增加,coins【1】可以重复被添加进来,而由于外层循环固定了,因此coins【2】只能在下一次外层循环添加进不同大小的背包中,这么看的话,coins【i+1】只能在coins【i】之后了;如果先遍历背包后遍历物品,那么外层循环先固定背包大小j,然后在大小为j的背包中循环遍历添加物品,然后在下次外层循环背包大小变为j+1,此时仍要执行内层循环遍历添加物品,也就会出现在上一轮外层循环中添加coins【2】的基础上还能再添加coins【1】的情况,那么就有了coins【1】在coins【2】之后的情况了。

cpp 复制代码
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];
    }
};

377.组合问题④

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

cpp 复制代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
            //组合不强调元素之间的顺序 排列强调元素之间的顺序。
            //1.先遍历物品在遍历背包是组合 
            //2.先遍历背包在遍历物品是排序数

            // 由于在题目下面的定义中 顺序不同的序列被视作不同的组合
            //所以选择第二个
        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]&&dp[i]<INT_MAX-dp[i-nums[j]])//当前的背包容量要大于物品容量 否则无意义
                 //防止整数溢出 如果不进行这个判断,当dp[i]和dp[i-nums[j]]都很大时,直接相加可能会导致整数溢出。
                dp[i]+=dp[i-nums[j]];
            }
        }
        return dp[target];
    }
};

二.GitHub链接本地仓库

频繁出现git@github.com: Permission denied (publickey).的问题,跟着csdn上的博主重走一遍流程就好了

流程如下:

进入git bash界面然后:

第1步,git config --global --list 验证邮箱与GitHub注册时输入的是否一致

可以通过git config --global user.name "yourname",git config --global user.email "email@email.com "(这里得名字和邮箱都是注册github时用的)设置全局用户名和邮箱。

第2步,ssh-keygen -t rsa -C "这里换上你的邮箱",一路回车(注意:不需要输入其他内容),直到生成密钥。

注意;根据上面地址和文件名可知, 会在/Users/***/路径下生成一个.ssh\id_rsa.pub文件,密钥就存储在其中:

第3步,使用浏览器到git仓库,添加秘钥右上角--> settings --> SSH and GPG keys 根据生成的秘钥,在github上加入ssh秘钥

最后 ssh -T git@github.com 测试一下通不通,通了显示如下

三.将本地仓库的文件推送到远程仓库:

本地仓库和远程仓库的示意图如下:(取自GeekHour)

链接成功后,可以在本地仓库创建文件,并通过push命令将文件推送给远程仓库

首先通过

创建远程仓库别名和地址

然后通过

查看一下 可知 当前的远程仓库名为test001

我在创建一个test002(测试)

切换main分支

并将当前文件推送到远程仓库的main分支

github上显示

代表推送成功。

相关推荐
油泼辣子多加1 小时前
2024年11月21日Github流行趋势
github
A洛2 小时前
Vercel 设置自动部署 GitHub 项目
github·webhooks·自动部署·vercel
油泼辣子多加3 小时前
2024年11月22日Github流行趋势
github
Stara05111 天前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
不能只会打代码1 天前
大学课程项目中的记忆深刻 Bug —— 一次意外的数组越界
java·github·intellij-idea·话题博客
Web极客码2 天前
如何修复WordPress卡在维护模式
服务器·网络·github
油泼辣子多加2 天前
2024年11月17日Github流行趋势
github
海里有太阳2 天前
gitHub常用操作
github
量子孤岛2 天前
建立独一无二的GitHub Profile
github
小小宇宙中微子2 天前
QDUOJ(青岛大学在线评测系统)
github