动态规划
ang_ang_ge
初中生,见谅Thanks♪(・ω・)ノ
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[动态规划]装满背包的方法(数量不限)
题目简介: 有大小为10 20 50 100 的四种物品,装入容量为 n 的背包,问刚好装满背包的方法数 样例1: 输入 0 输出 0 样例2: 输入 100 输出 11 样例3: 输入 15 输出 0 注意事项: 由于大小都是10的倍数,可进行判断: 若容量n是10的倍数,则将n除以2,物品大小以1 2 5 10计算; 若容量n不是10的倍数,则输出0,程序结束。 思路: 循环4个物品大小与1~n的容量,两者相减得到一个容量,此容量指放入当前循环物品前的容量,放入当前原创 2022-01-22 20:07:04 · 820 阅读 · 0 评论 -
[动态规划]编辑距离
【编辑距离】 设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共 有三种: 1、删除一个字符; 2、插入一个字符; 3、将一个字符改为另一个字符。 对任意的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。 【输入】 第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。 【输出】 只有一个正整数,为最少字符操作次数。 【输入样例】 sfdqxbw gfdgw 【输出样例】 4 dp函数中第一个坐标代表第一个字符串中的原创 2022-01-05 23:04:05 · 556 阅读 · 0 评论 -
[动态规划]数的划分
【数的划分】 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输出一个整数,即不同的分法。 【输入】 两个整数n,k(6<n≤200,2≤k≤6),中间用单个空格隔开。 【输出】 一个整数,即不同的分法。 【输入样例】 7 3 【输出样例】 4 思路: dp[i][j] 指在有 i 个数划分为 j 个时所有的方法数 如果是最普通的方程的话应该长这样: dp[i][j原创 2021-12-22 22:57:38 · 1025 阅读 · 0 评论 -
[动态规划]装满背包的方法数
呐,题在这儿 【装满背包的方法数】 有n个物品,找出能刚好装满背包(容量为t)的方法数。如: n=5, 5个物品大小分别为1,2,3,4,5,背包容量t=5; 那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。 【输入】 输入的第一行是两个正整数n和t,用空格隔开,其中1≤n≤20,表示物品的个数,t为背包容量(1≤t≤1000); 接下来的一行是n个正整数,用空格隔开。 【输出】 和为t的不同的组合方式的数目。 【输入样例】 5 5 1 2 3 4 5 【输出样例】 3 思路: 循环遍历每个物品原创 2021-12-15 22:55:02 · 2045 阅读 · 0 评论 -
[动态规划]导弹拦截2(习题)
动规导弹来喽!原创 2021-12-01 22:58:41 · 315 阅读 · 0 评论 -
[动态规划]混合背包问题(有三种背包问题模板)
问题如下: 有一个已知容量的背包与一些已知占用空间与价值的物品,一些物品只有一个,一些有几个,一些有无数个,问背包可容纳的最大价值。 本题就是将0/1背包、多重背包与完全背包问题进行结合,在判断问题类型后进行相对应的操作 模板 0/1背包问题: void one(int c, int w){ for (int v = m; v >= w; v--){ f[v] = max(f[v], f[v - w] + c); } } 完全背包问题: void wan(int c, int w原创 2021-11-14 14:27:29 · 775 阅读 · 0 评论 -
[动态规划]完全背包问题
本题与0/1背包问题非常相似,只是每个物品都有无限个。 给定物品种类个数,背包容量与各个物品的大小与价值,问可容纳的最大价值是多少? #include <bits/stdc++.h> using namespace std; // w,c数组分别储存重量和价值 int w[200],c[200],f[200]; int main(){ int m, n; cin >> m >> n; for (int i = 1; i <= n; i++){ cin原创 2021-11-10 22:05:54 · 94 阅读 · 0 评论 -
[动态规划]路径数
在m行n列中有多少条路径可以从(1,1)到(m,n)? #include <bits/stdc++.h> using namespace std; int a[1005]; int main(){ int m,n; cin >> m >> n; // 从左到右,逐次更新 for (int i = 1; i <= m; i++){ for (int j = 1; j <= n; j++){ if (i == 1 && j ==原创 2021-10-31 11:07:13 · 169 阅读 · 0 评论 -
[动态规划]价值相近的背包
0/1背包问题续:价值相近的背包 有两个背包与一些物品,放入两个背包中使价值最相近,问最小价值差是多少? 这道题中,数值具有容量和价值双重身份,价值差就是最大价值。 要做的就是在一个容量为总容量/2的背包中放尽量大价值的物品即可 (0/1背包问题思路看https://blog.youkuaiyun.com/ang_ang_ge/article/details/120799476?spm=1001.2014.3001.5501) 代码 #include <bits/stdc++.h> using namesp原创 2021-10-24 11:58:24 · 1761 阅读 · 0 评论 -
[动态规划]0/1背包问题(省空间复杂度)
0/1背包问题是动态规划中最为经典的题目。 有n个物品,已知各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 样例输入: 3 8 3 3 5 4 5 5 样例输出: 8 上一篇文章中用了二维数组,比较浪费空间复杂度,这里使用一维数组,思路与上一篇相同。(一维数组只保留最高价值) 由于用了一维数组,所以关键判别式应为 f[j] = max(f[j], f[j - w[i]] + c[i]); 代码如下: #include <bits/stdc++.h> using原创 2021-10-17 10:03:20 · 562 阅读 · 0 评论 -
[动态规划] 0/1背包问题
0/1背包问题是动态规划中最为经典的题目。 有n个物品,已知各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 样例输入: 3 8 3 3 5 4 5 5 样例输出: 8 思路: 动态规划,列表为先 接下来需要寻找规律,关键节点为: 当可以放入选定物品时进行价值比较。 如【5,2】: 当前可以放入物品2,这时需要比较两者价值,则比较【5,1】与【0,1】+自身价值 【5,1】是指如果不替换的价值;而【(5 - 5),1】是指腾出物品所需空间后剩余价值(第一个5为当前背包容量原创 2021-10-16 18:00:20 · 130 阅读 · 0 评论
分享