![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
背包dp
author:vehicel
description :背包DP
chstor
努力学好英语的菜狗
展开
-
P5020 货币系统
题目链接:P5020 货币系统题目大意:找出一组数中,有多少个数,不能被其他数表示DFS:先对数组进行从小到大排序(被表示的那个数一定是比它小的那些数相加而成)从最小的数开始选取,标记它和其他数能组合的所有数剪枝:①标记过的数不再标记,②大于最大值的数#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define mm(a,x) memse原创 2020-11-08 20:09:32 · 108 阅读 · 0 评论 -
P1855 榨取kkksc03
题目链接:P1855 榨取kkksc03多维01背包:在一维01背包的基础上,多加一维就可以代码如下:#include<iostream>using namespace std;const int N = 210;/**/int n,m,t;int f[N][N],v[N],c[N],w[N];int main() { cin >> n >> m >> t; for(int i = 1; i <= n; i ++原创 2020-11-07 20:37:29 · 233 阅读 · 0 评论 -
P1757 通天之分组背包
题目链接:P1757 通天之分组背包分组背包:在01背包的基础上,稍加更改,分析待补#include<iostream>using namespace std;const int N = 1010;int n,m;int f[N];int v[N][N],w[N][N],s[N],cnt[N];int t;int main() { cin >> m >> n; for(int i = 1; i <= n; i ++ ){ int原创 2020-11-06 21:27:24 · 84 阅读 · 0 评论 -
0x52 A 数字组合
题目链接:0x52 A 数字组合01背包问题:#include<iostream>using namespace std;const int M = 10010,N = 110;int n,m;int f[M];int v[N];/*状态表示:f[i][j]表示前i个数和为j的所有方案状态转移:不选 f[i][j] = f[i - 1][j] 选 f[i][j] = f[i - 1][j] + f[i - 1][j - v[i]];原创 2020-11-06 20:46:42 · 208 阅读 · 0 评论 -
P1049 装箱问题
题目链接:P1049 装箱问题01背包:剩余空间最小->使用空间最大#include<iostream>using namespace std;const int M = 20010,N = 40;int n,m;int f[M];int v[N];int main() { cin >> m >> n; for(int i = 1; i <= n; i ++ ) cin >> v[i]; for(int i = 1原创 2020-11-06 20:34:31 · 86 阅读 · 0 评论 -
P1060 开心的金明
题目链接:P1060 开心的金明01背包:#include<iostream>using namespace std;const int M = 30010,N = 30;/*状态表示:f[i][j]表示前i个价格为j的最大值 状态转移:不选 f[i][j] = f[i - 1][j]; 选 f[i][j] = max(f[i - 1][j],f[i - 1][j - v[i]] + w[i]); 初始化:f[0][0] = 0;原创 2020-11-06 20:14:33 · 66 阅读 · 0 评论 -
P1048 采药
题目链接:P1048 采药01背包问题:状态表示:f[i][j]表示取前i个草药,时间为j的最大价值状态转移:时间不够用if(j < v[i]) f[i][j] = f[i - 1][j];else时间够用(不选或者选)f[i][j] = max(f[i - 1][j],f[i - 1][j - v[i]] + w[i];初始化:f[0][0] = 0;res = max(res,f[n][0~m])代码如下(未优化):时间、空间复杂度为O(NM)原创 2020-11-06 11:58:48 · 418 阅读 · 0 评论 -
hdu_1024 Max Sum Plus Plus
题目链接:hdu_1024 Max Sum Plus Plus题目分析:将一组数据分成m段连续的子序列和,求这最大的分法不考虑优化,分析题目:状态表示:f[i][j]表示第i组共j个数的和状态转移:f[i][j] = max(f[i][j],f[i][j] + a[i],f[i - 1][k] + a[i]); (1 <= k < i)分别表示:不选第i个数,选第i个数,在i-1组中第k个数中断开,然后添加第i组的第一个数为a[j]因为题目数据过大,空间、时间复杂度都不符合,原创 2020-11-05 21:26:43 · 98 阅读 · 0 评论 -
P1077 摆花
题目链接:P1077 摆花题目大意:共m盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列,求一共多少种不同的摆花方案题目分析:依次枚举每一个种类的花(标号的从小到大的顺序依次摆列)把所有方案进行累加记忆化搜索:当大于m盆,就剪枝,等于m盆,就记录一种方案依次枚举每一个种类的花#include<iostream>using namespace std;const int N = 110;const int mod = 1000007原创 2020-11-04 20:44:10 · 163 阅读 · 0 评论