![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法基础
yuxin199
这个作者很懒,什么都没留下…
展开
-
9268:酒鬼——两种方式dp
链接:9268:酒鬼 题目不再赘述。 题意理解: 一排酒,每个瓶子里有不同量的酒,酒鬼可以选择喝或者不喝(喝就必须喝完),原题中说的不可以连续喝超过三瓶实际上是一个坑,其实是不能超过2,不可以达到3. 思路1: 类似于大盗阿福的考虑方式。令f[i]表示前i个酒瓶可以喝的最大值,对于第i个酒瓶,有三种(根据最大可连续喝的数量来进行的)转移方式:不选a[i]和a[i-1],选a[i]不选a[i-1],选a[i]和a[i-1]。 于是有转移表达式,:f[i] = max{f[i-1],f[i-2]+a[i],f[原创 2021-08-06 20:29:35 · 944 阅读 · 0 评论 -
8785:装箱问题 (隐藏的01背包)
问题描述: 有一个箱子容量为V(正整数,0<=v<=20000),同时有n个物品(0< n<=30),每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式: 第一行是一个整数V,表示箱子容量。 第二行是一个整数n,表示物品数。 接下来n行,每行一个正整数(不超过10000),分别表示这n个物品的各自体积。 输出格式: 一个整数,表示箱子剩余空间。 输入样例: 24 6 8 3 12 7 9 7 输出样例: 0 思想: 求剩余空间最小值原创 2021-05-09 22:23:15 · 180 阅读 · 0 评论 -
分组背包问题(二维+一维)
问题描述: 有 N 组物品和一个容量是 V 的背包。 每组物品有若干个,同一组内的物品最多只能选一个。 每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式: 第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。 接下来有 N 组数据: 每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量; 每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分原创 2021-05-09 10:46:18 · 232 阅读 · 0 评论 -
6049:买书 (完全背包方案数问题-二维+一维)
题目描述: 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。 问小明有多少种买书方案?(每种书可购买多本) 输入格式: 一个整数 n,代表总共钱数。(0 <= n <= 1000) 输出格式: 一个整数,代表选择方案种数 输入样例: 20 输出样例: 2 本题是一道完全背包的方案总数问题,在二维中 如果j<v[i],有f[i][j]=f[i-1][j] 否则j>=v[i],有f[i][j]=f[i-1][j]+f[i-1][j-v[i]]+f[i-1][j-原创 2021-05-09 09:58:25 · 782 阅读 · 1 评论 -
完全背包问题(朴素解法、优化后二维、优化后一维)
题目描述: 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。 第 i 种物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入: 4 5 1 2 2 4 3 4 4 5 输出: 10 朴素解法: #include<iostream> using namespace std; const int N=1010; int v[N],w[N]; int f[N][N]; int n,m; int main(原创 2021-05-09 09:30:57 · 266 阅读 · 0 评论 -
01背包问题(二维、一维)
题目描述: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入: 4 5 1 2 2 4 3 4 4 5 输出: 8 二维代码: #include<iostream> using namespace std; const int N=1010; int n,m; int v[N],w[N]; int f[N][N]; int main(){原创 2021-05-09 09:16:35 · 219 阅读 · 0 评论 -
NOI 06:月度开销
描述 农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。 约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。 约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。 输入 第一行包含两个整数N,M,用单个空格隔开。 接下来N行,每行包含一个1到10原创 2021-05-07 21:10:40 · 357 阅读 · 0 评论 -
ACWing789. 数的范围(附整数二分模板)
题解代码 #include<iostream> using namespace std; const int maxn=100000 + 10; int n,q; int a[maxn]; int main(){ scanf("%d%d",&n,&q); for(int i=0;i<n;i++)scanf("%d",&a[i]); while(q--){ int x; scanf("%d",&x);原创 2021-05-07 15:55:18 · 64 阅读 · 0 评论 -
AcWing827. 双链表
数组模拟链表 #include<iostream> #include<string> using namespace std; const int N=100010 ; int m; int e[N],l[N],r[N],idx; void init(){ r[0]=1,l[1]=0; idx=2; } void add(int k,int x){//下标为k的点的右边插入一个值为x的节点 e[idx]=x; r[idx]=r[k];原创 2021-05-07 12:27:14 · 71 阅读 · 0 评论 -
AcWing787-归并排序模板(普通数组和vector版)
vector版 下面展示 vector版本归并排序模板。 #include<iostream> #include<vector> using namespace std; const int maxn=1e6+10; int n; vector<int> a(maxn),temp(maxn); void merge_sort(vector<int> &a,int l,int r){ if(l>=r)return ;原创 2021-04-25 20:52:24 · 174 阅读 · 0 评论 -
AcWing785-快排模板(普通数组和vector版)
vector版 下面展示 vector版本快排模板。 #include<iostream> #include<vector> using namespace std; const int maxn = 1e6 +10; int n; vector<int> a(maxn); void quict_sort(vector<int> &a,int l,int r){ if(l>=r)return; int x=a[(r+l)原创 2021-04-25 11:59:23 · 151 阅读 · 0 评论