目录
1. 7. 混合背包问题 - AcWing题库(01背包+完全背包+多重背包)
闫氏DP分析法
总概:背包问题如下:
01背包 |
完全背包(无限背包) |
多重背包 |
树形背包 |
分组背包 |
混合背包 |
多维背包 |
1. 01背包
参考:总结——01背包问题 (动态规划算法)_并非所有流浪者都迷失了自我-CSDN博客_01背包问题动态规划算法【动态规划】01背包问题(通俗易懂,超基础讲解)_Yngz_Miao的博客-CSDN博客_动态规划解决01背包问题
1. 2. 01背包问题 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,V;
int v[maxn],w[maxn];
int f[maxn][maxn];
int main(){
cin>>n>>V;
for(int i=1;i<=n;++i){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=V;++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]);
}
}
}
cout<<f[n][V]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int f[MAXN]; //
int main() {
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
int v, w;
cin >> v >> w; // 边输入边处理
for(int j = m; j >= v; j--)
f[j] = max(f[j], f[j - v] + w);
}
cout << f[m] << endl;
return 0;
}
2.完全背包(无限背包)
1. 疯狂的采药 - 洛谷
设 f(i,j)表示前 i 件物品采药 j 时间能获得的最大价值。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5,M=1e7+5;
int n,m,w[N],v[N],f[M];
signed main(){
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+v[i]);
cout<<f[m];
return 0;
}
3.多重背包
参考:多重背包问题大全(超详细)_曼切斯特的流氓的博客-CSDN博客_多重背包问题