当前位置:网站首页>关于背包问题的总结
关于背包问题的总结
2022-06-22 05:23:00 【hhyy_d】
背包问题的分类:
1. 01背包问题
2. 完全背包问题
3. 多重背包问题
4. 完全背包问题
DP问题的解题思路:
- 01背包问题
问题描述:见例题:01背包问题
问题分析:对于每一个物品,可以选择要也可以选择。所以状态的计算就是更新i所表示的集合,因此,f(i,j) = max(f[i-1][j],f[i-1][j-v[i]]+w[i])。这就是朴素版的01背包问题,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,m;
int v[N],w[N];
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j = 0;j<=m;j++)
{
f[i][j] = f[i-1][j];//不选第i个物品
if(v[i] <= j) f[i][j] = max(f[i][j],f[i-1][j-v[i]]+w[i]); //看看选了第i个是否更好
}
}
cout<<f[n][m]<<endl;
return 0;
}
优化:我们可以发现i状态的f只与i-1有关,因此可以用滚动数组进行优化,只用一个一维数组就可以保存答案。此时j循环需要从m到v[i],因为j-v[i]的状态要在j状态更新之后。代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,m;
int v[N],w[N];
int f[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j = m;j >= v[i];j--)
{
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}
2.完全背包问题 完全背包问题
问题分析:对于每一个物品,可以不选择,也可以选择任意多个(所选体积需要小于V)
朴素版代码如下:(会超时)
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int v[N],w[N];
int n,m;
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
for(int k = 0;k*v[i] <= j;k++)
{
f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
}
}
cout<<f[n][m]<<"\n";
return 0;
}
优化如下:
f[i][j] = max(f[i-1][j],f[i-1][j-v]+w,f[i-1][j-2v]+2w,…f[i-1][j-kv]+k*w)
f[i[j-v] = max( f[i-1][j-v], f[i-1][j-2v]+w,f[i-1][j-3v]+2w,…f[i-1][j-kv]+(k-1)w)
第一个在第二个式子上面加上一个w。
所以f[i][j]可以优化为max(f[i][j],f[i][j-v]+w);
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int v[N],w[N];
int n,m;
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j] = f[i-1][j];
if(j >= v[i]) f[i][j] = max(f[i][j],f[i][j-v[i]]+w[i]);
}
}
cout<<f[n][m]<<"\n";
return 0;
}
最后按照上面的更新方法,根据滚动数组,优化为一维的。
因为这里的状态更新是根据本层来更新的,所以不需要逆序。
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int v[N],w[N];
int n,m;
int f[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=v[i];j<=m;j++)
{
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<"\n";
return 0;
}
3.多重背包问题 多重背包I
问题分析,这里合完全背包区别在于数量不是无限的,因此,稍加修改即可
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m;
int v[N],w[N],s[N];
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i]>>s[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
for(int k = 0;k<=s[i]&&k*v[i]<=j;k++)
{
f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
}
}
cout<<f[n][m]<<endl;
return 0;
}
多重背包优化 多重背包问题II
这里使用二进制来进行优化,每一种物品都可以用1,2,4,8…捆绑表示,所以可以将此问题转化为01背包问题,物品是捆绑之后的物品。这里直接写最后代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010,M = 25000;
int n,m;
int v[M],w[M];
int f[M];
int main()
{
cin>>n>>m;
int cnt = 0;//计算捆绑的编号
for(int i = 1;i<=n;i++)
{
int a,b,s;
cin>>a>>b>>s;
int k = 1;
while(k <= s)
{
cnt++;
v[cnt] = k*a;
w[cnt] = k*b;
s -= k;
k*=2;
}
if(s) {
cnt++;v[cnt] = s*a,w[cnt] = s*b;}
}
n=cnt;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}
4.分组背包问题:分组背包
朴素版:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m;
int v[N][N],w[N][N],s[N];
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
for(int j=0;j<s[i];j++)
{
cin>>v[i][j]>>w[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j =0;j<=m;j++)
{
f[i][j] = f[i-1][j];
for(int k=0;k<s[i];k++)
{
if(v[i][k] <= j) f[i][j] = max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
}
}
}
cout<<f[n][m]<<endl;
return 0;
}
按照刚刚的方法进行优化
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m;
int v[N][N],w[N][N],s[N];
int f[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
for(int j=0;j<s[i];j++)
{
cin>>v[i][j]>>w[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j =m;j>=0;j--)
{
for(int k=0;k<s[i];k++)
{
if(v[i][k] <= j) f[j] = max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
cout<<f[m]<<endl;
return 0;
}
背包问题到此结束
参考 : ACWing基础课
边栏推荐
- C语言数据类型转换规则(隐式转换+显式转换)
- Monorepo Sliding methodology: Reference module Hot Update
- Kubernetes - deploy application to cluster
- C#中Cookie设置与读取
- Flink deployment mode (II) - three deployment modes of yarn
- MySQL day04 class notes
- 2022 new test questions for tea specialists (primary) and summary of tea specialists (primary) examination
- [camp] at the beginning, improve [leopard] power - vivo activity plug-in management platform
- Kubernetes——裸机搭建集群环境
- Remote dictionary server (redis) - a kV based NoSQL database management system used as a cache
猜你喜欢

1108. Defanging an IP Address

7. Gateway global filter

Tupu software 2D and 2.5D case collection | smart Park, data center, SMT production line
![Force buckle 33 [search rotation sort array]](/img/0f/d7e2f2fdf48bcd70e6c69bca7d4002.png)
Force buckle 33 [search rotation sort array]

It is easy to analyze and improve R & D efficiency by understanding these five figures

JS regular expression to implement the thousands separator

1108. Defanging an IP Address
![[cloud native] 2.2 kubeadm create cluster](/img/b2/a57b7e44f74357d5aedbb9ddcd95ff.png)
[cloud native] 2.2 kubeadm create cluster

Use keytool to access the JKS file get SSL certificate

Kubernetes——部署应用到集群中
随机推荐
Pytest (12) -allure common features allure attach、allure. step、fixture、environment、categories
Rambbmitmq Push Party
How to display loading animation when requesting data
Opencv function usage details 1~10, including code examples
Monorepo Sliding methodology: Reference module Hot Update
Topic selection system of college graduation design based on SSM
风阀执行EN 1634-1耐火测试完整性能坚持 4小时吗?
非递归打印斐波那契数列
Zset type of redis
MySQL day02 class notes
Detailed explanation of deep learning technology for building an image search engine that can find similar images
Flink deployment mode (I) - standalone and Application
What are the high availability designs of yarn?
Tidb performance overview panel
Monorepo丝滑方法论:引用模块热更新
DeformConv
Database - basic knowledge
Create a new local content and upload it to the code cloud branch
C#中Cookie设置与读取
Build JSP development environment in vs Code