背包九讲类型汇总:

1.01背包问题

2.完全背包问题

3.多重背包问题

4.混合背包问题

5.二维费用的背包问题

6.分组背包问题

7.有依赖的背包问题

8.背包问题求方案数

9.求背包问题的具体方案




注:以下所有题目来源于ACwing题库 Acwing 题库

这里每个类型基本都是具体题目+自己的一些体会+代码,背包九讲的理论以及解析证明之类的可以参见这位大佬的博客,很详细 here




1. 01背包问题 Acwing 02

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8

朴素版解法:二维空间解法
每件物品只能选一次,对于每种物品,我们有两种选择

1.不选 -> dp[i][j]=dp[i-1][j]
等于选前i-1个物品,空间为j情况下的最优解
2.选 -> dp[i][j]=dp[i-1][j-v[i]]+w[i]
如果选的话,前i-1个物品的体积最多为j-v[i]

在这两种情况中取较大值即可,即为当前情况的最优解,我们的每一步都是从上一步的最优解转移过来,所以可以保证最后的结果一定是最优解

#include<iostream>
using namespace std;
#define N 1005
int dp[N][N];  //dp[i][j]表示前i个物品,背包容量是j的情况下的最大价值。
int w[N];
int v[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];if(j>=v[i])  dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);} }cout<<dp[n][m]<<endl;return 0;
}

解法二:滚动数组优化:(实际上只需要一个数组)

状态转移每次只与上一层有关,所以用一个一维数组就可以
转移方程:dp[i]=max(dp[i],dp[i-v[i]]+w[i])

其实就相当于二维中的 dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i])

所以第二层循环需要从大到小循环,因为若是继续从小到大循环,后面算的时候,用的是这一层已经算过的数据,就变成dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]) ,(这正好是完全背包一维的解法,每个物品可以选无限次)而从大到小算的话一定用的是上一层的状态

#include<iostream>
using namespace std;
#define N 1005
int dp[N];
int main()
{int n,m,v,w;cin>>n>>m;for(int i=1;i<=n;i++){cin>>v>>w;for(int j=m;j>=v;j--){dp[j]=max(dp[j],dp[j-v]+w);} }cout<<dp[m]<<endl;return 0;
}

注:这时的dp[i]表示空间<=i的最大价值,所以最后直接输出dp[m]即可,这与初始化有关,因为dp数组在主函数外定义,初始值均为0,所以如果存在一个k<m 使得空间最大为k的情况下dp[k]有最大价值,那么dp[m]一定可以从k这个状态转移过来—即dp[m]一定是最大值。
若题目要求装满背包,即将物品恰装入一个容量为m的背包中,只需要将初始化条件改一改即可,----将dp数组初始化为负无穷,dp[0]=0,即可确保状态一定是从0转移过来的。



2.完全背包问题 Acwing 03

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

朴素版解法:二维空间解法
也是两种选择,选或不选,只不过每个物品可以选无限次,在01的基础上把
dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i])
改为
dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i])即可

#include<iostream>
using namespace std;
#define N 1005
int dp[N][N];
int w[N];
int v[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];if(j>=v[i])dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);} }cout<<dp[n][m]<<endl;return 0;
}

优化空间版解法:
转移方程为dp[j]=max(dp[j],dp[j-v[i]]+w[i])
第二层从小到大循环,原因参见01的一维

#include<iostream>
using namespace std;
#define N 1005
int dp[N];
int main()
{int n,m,w,v;cin>>n>>m;for(int i=1;i<=n;i++){cin>>v>>w;for(int j=v;j<=m;j++){dp[j]=max(dp[j],dp[j-v]+w);} }cout<<dp[m]<<endl;return 0;
}


3.多重背包问题

题目1:o(n^3)做法 Acwing 04

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤100
0<vi,wi,si≤100
输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10

思路:是01背包的延伸,就不说二维做法了,跟上面差不多。直接贴一维做法。
01背包是选或不选 :
dp[j]=max(dp[j],dp[j-v[i]]+w[i])
多重背包是选0个,1个,2个…s[i]个
即dp[j]=max(dp[j],dp[j - v[i] * k]+w[i] * k)
k=1,2,3,…s[i]
那么再加一层循环表示选多少个就可以了
因为是01背包的扩展,所以第二层循环应从大到小循环

#include<iostream>
using namespace std;
#define N 105
int w[N];
int v[N];
int s[N];
int dp[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d%d",&v[i],&w[i],&s[i]);for(int i=1;i<=n;i++){for(int j=m;j>=v[i];j--){for(int k=1;k<=s[i] && j>=k*v[i];k++)dp[j]=max(dp[j],dp[j-k*v[i]]+w[i]*k);} }cout<<dp[m]<<endl;return 0;
}


方法2:二进制优化做法 Acwing 05

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 ii 种物品的体积、价值和数量。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N≤1000
0<V≤2000
0<vi,wi,si≤2000
提示:
本题考查多重背包的二进制优化方法。

输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10

思路:这道题的数据范围如果用三层循环的话是达到了1e9,所以必须优化它。其实可以把它转化为一个01背包的问题。每个物品有s件,我们可以把它差分成s份,每份物品当做不同的个体,即只能选一次,这就转化为了01背包物品,但是这样的话,物品个数变成了1000*2000=2e6,再循环一层空间的话,还是1e9的复杂度。

那么继续优化,一个物品的数量是s的话,只要把s拆分成一些数字,使它们能够表示出1-s中任意一个数字,就可以,没必要把它拆成s个1。
那么这样的数字最少需要多少个呢?最少需要log(s)个,向上取整。
比如7,它最少需要3个数字来表示:
即 1(2^0=1 ), 2(2^1=2), 4(2^2=4)。
原因:每个数字有2种可能选或不选,那么可以表示的不同数字个数就是 2 * 2 * 2 = 8。但是还需要注意一个问题,就是有些数字可能能够表示出来一些大于s的数字,但是这件物品最多只有s件,那么就需要特殊处理一下最后一个数。
比如10,若用1,2, 4, 8表示,可能会表示出来大于10的数字,例如:4+8=12。那么如果最后一个数字加上前面数的总和会大于s,就将它替换为剩下的物品个数,即将8替换为3,这时正好能表示出1-s所有的数,-> 1, 2,4可以表示7以内的所有数,这些数加上3就可以表示10以内的所有数啦。
注:如果拆分成log(s)个的话,时间复杂度就变为1000 * log(2000) * 2000 = 2e7,是可以通过的~

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1005 , M=2005;
int dp[M],v[N*M],w[N*M];
int main()
{int n,m,k=0;cin>>n>>m;for(int i=0;i<n;i++){int vv,ww,s;cin>>vv>>ww>>s;for(int i=1;i<=s;i*=2)   //二进制优化v[k]=vv*i,w[k++]=ww*i,s-=i;if(s>0)v[k]=vv*s,w[k++]=ww*s;}for(int i=0;i<k;i++)        //01背包for(int j=m;j>=v[i];j--)dp[j]=max(dp[j],dp[j-v[i]]+w[i]);cout<<dp[m]<<endl;return 0;
}


题目3:多重背包终极版… Acwing 06

题目跟上面一样,但是数据范围如下

用的是单调队列优化,效果是把那层log(s)去掉,变成n*v的复杂度。这个写法我也只是能看懂而已qaq,铺开证明还真有点困难,,网上看到这篇写的挺好,很详细,感兴趣戳 here



4.混合背包问题 Acwing 07

有 N 种物品和一个容量是 V 的背包。

物品一共有三类:

第一类物品只能用1次(01背包);
第二类物品可以用无限次(完全背包);
第三类物品最多只能用 si 次(多重背包);
每种体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

si=−1 表示第 i 种物品只能用1次;
si=0 表示第 i 种物品可以用无限次;
si>0 表示第 i 种物品可以使用 si 次;
输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
−1≤si≤1000−1
输入样例
4 5
1 2 -1
2 4 1
3 4 0
4 5 2
输出样例:
8

思路:是一个前三种背包问题的综合,如果明白了前面的,就很简单了,只需要判断一下类型,如果是多重背包,将它转换为01背包插入数组当中,然后按着不同类型的处理方式去遍历空间大小即可。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1005;
int s[N],v[N],w[N],dp[N];
int main()
{int n,m;cin>>n>>m;for(int i=0;i<n;i++){cin>>v[i]>>w[i]>>s[i];if(s[i]==-1) s[i]=1;  //01背包相当于物品件数为1的多重背包}for(int i=0;i<n;i++){if(s[i]==0)          //完全背包,按照完全背包的方式,从小到大枚举体积{for(int j=v[i];j<=m;j++)dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}for(int k=1;k<=s[i];s[i]-=k,k*=2)  //多重背包进行二进制优化{for(int j=m;j>=0;j--)if(j>=k*v[i])dp[j]=max(dp[j],dp[j-v[i]*k]+k*w[i]);}for(int j=m;j>=0;j--)if(j>=s[i]*v[i])dp[j]=max(dp[j],dp[j-s[i]*v[i]]+w[i]*s[i]);}cout<<dp[m]<<endl;return 0;
}



5.二维费用的背包问题 Acwing 08

有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。

每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V, M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。

接下来有 N 行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i 件物品的体积、重量和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N≤1000
0<V,M≤100
0<vi,mi≤100
0<wi≤1000
输入样例
4 5 6
1 2 3
2 4 4
3 4 5
4 5 6
输出样例:
8

思路:这个题也很简单,就是在01背包的基础上加了一维重量,枚举的时候多一层循环就行了。因为是01背包的变形,所以重量和体积枚举的时候都从大到小枚举。

#include<iostream>
using namespace std;
#define N 1005
int dp[N][N];
int main()
{int n,V,M,v,w,m;cin>>n>>V>>M;for(int i=0;i<n;i++){cin>>v>>m>>w;for(int j=V;j>=v;j--){for(int k=M;k>=m;k--)dp[j][k]=max(dp[j][k],dp[j-v][k-m]+w);}}cout<<dp[V][M]<<endl;return 0;}



6.分组背包问题 Acwing 09

有 N 组物品和一个容量是 V 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式
第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。

接下来有 N 组数据:

每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;
每组数据接下来有 Si行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;
输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤100
0<Si≤100
0<vij,wij≤100
输入样例
3 5
2
1 2
2 4
1
3 4
1
4 5
输出样例:
8

思路:和多重背包有一些类似,多重背包是每个物品有si件,可以选0,1,2…si件。而分组背包是不选,选第1个,或第2个或第3个…或第si个,都有si+1种决策方式,即使用三层循环即可解决。没有优化方式。

#include<iostream>
#include<vector>
using namespace std;
#define N 105
int dp[N];
int v[N];
int w[N];
int main()
{int n,m,s;cin>>n>>m;for(int i=0;i<n;i++){cin>>s;for(int k=0;k<s;k++)cin>>v[k]>>w[k];for(int j=m;j>=0;j--)for(int k=0;k<s;k++)if(j>=v[k])dp[j]=max(dp[j],dp[j-v[k]]+w[k]);}cout<<dp[m]<<endl;return 0;
}



7.有依赖的背包问题 Acwing 10

有 NN 个物品和一个容量是 VV 的背包。

物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。

如下图所示:

如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。

每件物品的编号是 ii,体积是 vivi,价值是 wiwi,依赖的父节点编号是 pipi。物品的下标范围是 1…N1…N。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式
第一行有两个整数 N,VN,V,用空格隔开,分别表示物品个数和背包容量。

接下来有 NN 行数据,每行数据表示一个物品。
第 ii 行有三个整数 vi,wi,pivi,wi,pi,用空格隔开,分别表示物品的体积、价值和依赖的物品编号。
如果 pi=−1pi=−1,表示根节点。 数据保证所有物品构成一棵树。

输出格式
输出一个整数,表示最大价值。

数据范围
1≤N,V≤1001≤N,V≤100
1≤vi,wi≤1001≤vi,wi≤100
父节点编号范围:

内部结点:1≤pi≤N1≤pi≤N;
根节点 pi=−1pi=−1;
输入样例
5 7
2 3 -1
2 2 1
3 5 1
4 7 2
3 6 2
输出样例:
11

思路:其实有依赖的背包问题和树形dp很类似,它把树形dp和分组背包结合到了一起。
选一个物品必须要选择它的父节点,那么反过来,父节点选择子节点,一定会选择价值最大的那一分支。那么就可以先递归算出子树的每一个体积对应的最大价值,然后进行分组背包,求出最大值即可。

需要注意的是,我们选择了子节点,就必须选择当前节点,那么最后需要把父节点的位置空出来。(把所有已算完的体积更新一下,在里面加上父节点这一物品)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N =1005;
int e[N],w[N],v[N],ne[N],h[N],idx;
int dp[105][105];
int n,m;
void init()
{memset(h,-1,sizeof h);idx=0;
}
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int x)
{for(int i=h[x];i!=-1;i=ne[i]){int son=e[i];dfs(son);for(int j=m;j>=0;j--){for(int k=0;k<=j;k++)dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[son][k]);}}for(int i=m;i>=0;i--)if(i>=v[x])dp[x][i]=dp[x][i-v[x]]+w[x];else          //注意,父节点不选的话,子节点一个都不能选dp[x][i]=0;}
int main()
{init();int root;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int fa;scanf("%d%d%d",&v[i],&w[i],&fa);if(fa==-1)root=i;elseadd(fa,i);}dfs(root);cout<<dp[root][m]<<endl;return 0;
}



8.背包问题求方案数 Acwing 11

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出 最优选法的方案数。注意答案可能很大,请输出答案模 10^9+7 的结果。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。

输出格式
输出一个整数,表示 方案数 模 10^9+7的结果。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 6
输出样例:
2

思路:在原来01背包的基础上加一个表示方案数的数组即可。注意初始化,如果只把num[0]赋值成1,那么需要把对应的01背包转化为体积恰好是j的情况下的最大价值。最后找出最大价值,将此价值对应的所有体积的方案数加上即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
const int mod=1e9+7;
const int N =1005;
int dp[N],num[N],v[N],w[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);memset(dp,-inf,sizeof dp);dp[0]=0;num[0]=1;int maxw=0;for(int i=1;i<=n;i++){for(int j=m;j>=v[i];j--){if(dp[j-v[i]]+w[i]>dp[j]){dp[j]=dp[j-v[i]]+w[i];num[j]=num[j-v[i]];}else if(dp[j-v[i]]+w[i]==dp[j])num[j]=(num[j]+num[j-v[i]])%mod;}}for(int i=0;i<=m;i++)maxw=max(maxw,dp[i]);int ans=0;for(int i=0;i<=m;i++)if(dp[i]==maxw)ans=(ans+num[i])%mod;cout<<ans<<endl;return 0;
}



9.背包问题求具体方案 Acwing 12

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出 字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…N。

输入格式
第一行两个整数,N,V 用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式
输出一行,包含若干个用空格隔开的整数,表示最优解中所选物品的编号序列,且该编号序列的字典序最小。

物品编号范围是 1…N。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 6
输出样例:
1 4

思路:因为方案可能有很多种,题目要求输出字典序最小的,那么就倒着枚举物品种类,贪心思想,确保序号小的能优先选择。最后输出一下可行的转移路径就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N =1005;
int dp[N][N],v[N],w[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);for(int i=n;i>=1;i--){for(int j=m;j>=0;j--){dp[i][j]=dp[i+1][j];if(j>=v[i])dp[i][j]=max(dp[i][j],dp[i+1][j-v[i]]+w[i]);}}int val=m;for(int i=1;i<=n;i++){if(val-v[i]>=0&&dp[i][val]==dp[i+1][val-v[i]]+w[i]){cout<<i<<" ";val-=v[i];}}return 0;
}



~~~我跟着yxc大佬的视频看的,讲的超级棒。
大佬视频

背包九讲----整理+例题相关推荐

  1. 【算法】动态规划+“背包九讲”原理超详细讲解+常见dp问题(9种)总结

    目录 一.动态规划(DP) 二.背包九讲 (1)完全背包 P1616 疯狂的采药(完全背包) (2)01背包 滚动数组 一维数组 P1048 采药(01背包) 01背包表格图示 (3)多重背包 整数拆 ...

  2. 算法--背包九讲(详细讲解+代码)

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  3. dalao的背包九讲

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  4. 【转】《背包九讲》--崔添翼大神

    背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物 ...

  5. 转载——背包九讲(原文链接已不可考)

    浙大崔添翼对背包问题的讲解,观点很高也很深刻,特此转载. 背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问 ...

  6. dd大牛的背包九讲-背包问题汇总

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  7. 完全背包问题python_令人头疼的背包九讲(2)完全背包问题

    重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题. 题目 完全背包问题 题目要求 有n ...

  8. 背包九讲之一:01背包问题

    文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...

  9. 背包九讲之二:完全背包问题

    文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...

  10. 背包九讲 (蒟蒻版)之01背包

    hello,你们的loony上线啦.你们知道吗?我今天早上起来一看手机,600多人在CSDN上访问过我,当时我心情都要炸了(补充:高兴炸了),因为,这毕竟只是本蒟蒻的梦想嘛~ 好了不嘚瑟啦! 今天就来 ...

最新文章

  1. linux 常用find命令
  2. python中文解释-python注释不能识别中文
  3. MySQL5.6 主从复制配置
  4. myeclipse导入外部javaweb项目
  5. 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...
  6. Android 通过代码改变控件的布局方式
  7. Azure上基于HTTP trigger的Lambda Function
  8. 201521123050 《Java程序设计》第8周学习总结
  9. 250分b区计算机专硕,2021兰州大学研究生复试分数线
  10. 汇编学习--7.16--端口
  11. 人工智能行业每日必读(2020年1月14日)
  12. 金融风控中英文术语手册(银行_消费金融信贷业务)_version5
  13. 439计算机毕业设计
  14. varchar(50)中50的涵义
  15. 【阅读】当我遇见一个人
  16. 如何分析个股基本面_个股的基本面分析_如何看个股的基本面
  17. 鸿蒙OS架构及关键技术整理
  18. 射频工程师必须知道的:PA功率放大器那些事!
  19. Qt的LGPL协议是否意味着可以自由用QT开发商业软件?
  20. “网管”必备的五大网络数据分析工具

热门文章

  1. 被黑心商家坑了N次,探究抽奖背后的秘密 —— H5转盘小游戏完整实现(源码直接拿走)
  2. matlab2018历史命令在哪,2018美赛准备之路——Matlab基础——命令行功能函数
  3. 夜间灯光数据dn值_探讨DMSPOLS夜间灯光数据的校正
  4. 计算机科学与技术专业导论mooc答案,中国大学MOOC人工智能导论(2017级)网课答案...
  5. JavaWeb项目开发流程
  6. 全民小视频 无水印下载教程 (三步完成)
  7. java中的递归算法_java递归算法详解
  8. python 刷票_Python刷票器的简单实现
  9. Windows网络编程之UDP通信
  10. IATF16949认证辅导,FMEA和CP的顾客额外批准,对供应链安全的管理(适用时)